如何正确预加载 SKScenes?

How do I properly preload SKScenes?

我遇到了与 here 所述完全相同的问题,但建议的解决方案不起作用。简而言之,当在场景之间转换时,中间的转换被完全跳过,因为 presentee 加载时间太长。现在我正在寻找一种方法来正确预加载场景的所有内容。 我做的是:

  1. alloc/init应用启动时的场景
  2. 预加载所有纹理 场景包括此后
  3. 几秒后,呈现 场景.

第一次触发转换时,它总是被跳过,所有后续尝试都按预期工作。

这是我如何 alloc/init 和预加载场景(启动时)的示例:

self.menuScene = [[LEMenuScene alloc] initWithSize:self.bounds.size];
[self.menuScene preload];

其中 preload 是 SKScene 的一个类别:

- (void) preload {
    NSMutableArray* allTextures = [[NSMutableArray alloc] init];
    [self enumerateChildNodesWithName:@"//SKSpriteNode" usingBlock:^(SKNode *node, BOOL *stop) {
        SKTexture* texture = ((SKSpriteNode*)node).texture;
        if (texture) [allTextures addObject: texture];
    }];

    [SKTexture preloadTextures:allTextures withCompletionHandler:^{
        //nop
    }];
}

我知道加载是异步执行的,preload 会立即 return(这是有意的),所以我可以在加载完成之前进行转换,但它不会无论我等多久,它总是滞后。

非常感谢tips/help!

原来问题根本不是纹理。我拼错了字体名称,导致系统寻找合适的替代品,导致延迟。

这是同样的问题: How to cache or preload SKLabelNode font?