从 Spritekit 纹理图集中加载纹理的最高效方法
Most performant way to load textures from a Spritekit texture atlas
我想不出如何在短短几秒钟内加载我的纹理。它需要一个怪物 20+ 秒。
最初我在单独的纹理图集中制作动画。它们的名称类似于 sprite_002@2x~iphone.png
。当它们分开时,我使用了类似于 Apple 文档中的代码:
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 秒的加载时间,所以我知道我在这里做错了。
您的加载时间将取决于您的地图集的大小。所以如果你碰巧有很多,而且很大,这需要一些时间。
我以前在这里看到过这类问题的变体。
我的建议是实际改变您解决问题的方法。这正在分解工作量并随着时间的推移在后台进行。这就是为什么很多游戏都有加载屏幕的原因。
根据您的游戏,您可能可以在玩游戏时更加偷偷摸摸地在后台加载纹理(或与此相关的任何资产)。通常情况下,您不需要在游戏开始时加载所有纹理。
当我制作游戏时,我做的第一件事就是创建一个后台加载器(如果我还没有的话)。然后我围绕异步加载资产的前提构建游戏。
20 秒很长。但是根据您的描述,这听起来需要很长时间。
我想不出如何在短短几秒钟内加载我的纹理。它需要一个怪物 20+ 秒。
最初我在单独的纹理图集中制作动画。它们的名称类似于 sprite_002@2x~iphone.png
。当它们分开时,我使用了类似于 Apple 文档中的代码:
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 秒的加载时间,所以我知道我在这里做错了。
您的加载时间将取决于您的地图集的大小。所以如果你碰巧有很多,而且很大,这需要一些时间。
我以前在这里看到过这类问题的变体。
我的建议是实际改变您解决问题的方法。这正在分解工作量并随着时间的推移在后台进行。这就是为什么很多游戏都有加载屏幕的原因。
根据您的游戏,您可能可以在玩游戏时更加偷偷摸摸地在后台加载纹理(或与此相关的任何资产)。通常情况下,您不需要在游戏开始时加载所有纹理。
当我制作游戏时,我做的第一件事就是创建一个后台加载器(如果我还没有的话)。然后我围绕异步加载资产的前提构建游戏。
20 秒很长。但是根据您的描述,这听起来需要很长时间。