代码之家  ›  专栏  ›  技术社区  ›  Double M

如何正确预加载SKScene?

  •  0
  • Double M  · 技术社区  · 9 年前

    我的问题与所描述的完全相同 here 然而,提议的解决方案行不通。简而言之,当在场景之间转换时,由于演示者需要很长时间才能加载,因此会完全跳过场景之间的转换。现在我正在寻找一种方法来正确预加载场景的所有内容。 我所做的是:

    1. 应用程序启动时分配/初始化场景
    2. 预加载所有纹理 该场景由以下部分组成
    3. 几秒钟后,呈现 场景

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

    下面是我如何分配/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
        }];
    }
    

    我知道加载是异步执行的 预加载,预加载 将立即返回(这是预期的),因此我可以在加载完成之前进行转换,但不管我等待多长时间,它总是滞后的。

    非常感谢任何提示/帮助!

    1 回复  |  直到 7 年前
        1
  •  0
  •   Community CDub    7 年前

    事实证明问题根本不在于纹理。我拼错了字体的名称,这使得系统寻找合适的替代品,导致了延迟。

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