从SpriteKit纹理图集中加载纹理的最高效方法

3

我无法在几秒钟内加载我的纹理。它需要20多秒的时间。

最初,我的动画是分别存储在不同的贴图集中。它们的名称类似于sprite_002@2x~iphone.png。当它们是分离的时候,我使用了类似于苹果文档中的代码:

SKTextureAtlas *atlas = [SKTextureAtlas atlasNamed:@"monster"];
SKTexture *f1 = [atlas textureNamed:@"monster-walk1.png"];
SKTexture *f2 = [atlas textureNamed:@"monster-walk2.png"];
SKTexture *f3 = [atlas textureNamed:@"monster-walk3.png"];
SKTexture *f4 = [atlas textureNamed:@"monster-walk4.png"];
NSArray *monsterWalkTextures = @[f1,f2,f3,f4];

我的代码是:

let names = myAtlas.textureNames as [String];
for name in names {
   myTextureArray.append(myAtlas.textureNamed(name as String));
}

对于6个不同纹理图集中的6个动画,每个动画有250帧,加载大约需要6秒。

我能够消除60-70%的帧并将所有内容压缩到单个纹理图集中,但现在我无法在合理的时间内加载它。

我一直在尝试以下代码:

    for i in 1...124 {
        let name = String(format: "sprite_%03d", i);
        let texture = imagesAtlas.textureNamed(name);
        spriteTextures.append(texture);
    }

大部分 iPhone 游戏启动时间不会超过 20 秒,所以我知道我这里做错了什么。


你使用什么字体?看看这个链接:https://dev59.com/63_aa4cB1Zd3GeqPxgOT#23255935。这里有一个关于iOS应用程序性能的讨论:http://stackoverflow.com/questions/28041605/sprite-kit-animatewithtextures-lags/28046024#28046024。也许其中一些内容会有所帮助。 - Whirlwind
1个回答

1

您的加载时间将取决于您的图集大小。因此,如果您有大量且较大的图集,它将需要一些时间。

我以前在这里看到过类似问题的变化。

我的建议是实际上改变解决问题的方法。这是将工作负载分解并在后台随时间完成的过程。这就是为什么许多游戏都有加载屏幕。

根据您的游戏,您可能可以特别狡猾地在游戏进行时在后台加载纹理(或任何资产)。往往情况下,您不需要在游戏开始时加载所有纹理。

当我制作游戏时,我首先要做的事情之一就是创建一个后台加载器,如果我还没有一个的话。然后我围绕异步加载资产的前提构建游戏。

20秒相当长。但根据您的描述,听起来需要花费相当数量的时间。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接