【问题标题】:SpriteKit sometimes fails to load SKTextureSpriteKit 有时无法加载 SKTexture
【发布时间】:2014-12-04 11:12:48
【问题描述】:

我目前在 SpriteKit 和 SKTexture 预加载方面遇到了一个奇怪的间歇性问题。我有多个图像数组,我按以下格式预加载:

- (NSDictionary *)loadTexturesWithNames:(NSArray *)aNames
{
    NSMutableDictionary *dict = [NSMutableDictionary dictionary];
    NSMutableArray *textureArray = [NSMutableArray array];

    for (NSString *textureName in aNames)
    {
        SKTexture *texture = [SKTexture textureWithImageNamed:textureName];
        if (texture)
        {
            [textureArray addObject:texture];
            [dict setObject:texture forKey:textureName];
        }
    }

    [SKTexture preloadTextures:textureArray withCompletionHandler:^{
        _iCounter++;
        [self loadTextures];
    }];

    return dict;
}

这在 90% 的情况下都可以正常工作,但偶尔会出现以下错误:

SKTexture:加载图片资源时出错:

这不会发生在任何特定的图像集上,只是随机发生。因此,有时播放器会加载正常,而其他播放器则不会。这可能是内存问题吗?我使用 _iCounter 拆分纹理加载,确保在开始下一组图像之前加载前一组图像,以尝试停止过多的并发加载。这加快了进程,但我仍然看到这个间歇性问题。

有没有其他人看到过这种情况,或者知道是什么原因造成的?

【问题讨论】:

    标签: ios sprite-kit preloading sktexture


    【解决方案1】:

    根据我的经验,一个常见原因是您没有等待调用完成处理程序。例如,在“图像”是预加载的图像之一的情况下执行此类操作可能是错误的来源:

    [self loadTexturesWithNames:names];
    SKSpriteNode* sprite = [SKSpriteNode spriteNodeWithImageNamed:@"image"];
    

    当然,如果你只在loadTexture 方法中创建精灵节点和纹理应该没问题。除非您执行其他后台任务或在后台运行 loadTextureWithNames 选择器(单独的线程)。

    【讨论】:

    • 嗨,当预加载纹理时,是否有像我目前那样存储对它们的引用的开销? IE。像你一样简单地加载纹理然后调用 [SKSpriteNode spriteNodeWithImageNamed:@"image"] 会更好吗?在预加载所有图像之前,我不会使用任何纹理,但会通过完全分离调用来仔细检查这不是问题。
    • 嗯,一旦 loadTexturesWithNames: 方法返回,您的 textureArray 就会被释放,并且该数组也不会传递给 loadTexture。这实际上可能会使预加载无效,具体取决于 Sprite Kit 中纹理缓存的实现方式。
    • 我想你可能已经一针见血了,我已经将它存储在一个整体保留的数组中,现在它似乎加载得很好。感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-10
    相关资源
    最近更新 更多