【发布时间】:2015-04-07 19:22:30
【问题描述】:
我无法缓存大型纹理图集(几乎是完整的 2048x2048)并将其用于带有纹理的动画。它最初在第一次加载时滞后。之后就可以了。对于我所有其他的地图集,我只是将它们放在一个单例中,并使用以下链接中的方法保存它们:https://www.codeandweb.com/blog/2013/09/23/spritekit-animations-and-textureatlases self.atlas = [SKTextureAtlas atlasNamed:SPRITES_ATLAS_NAME]
似乎它正在加载然后卸载内存中的纹理图集。有没有其他人经历过这个? 使用 Swift 1.2、SpriteKit、Texture Packer
【问题讨论】:
-
你应该更准确。纹理有多大,您在地图集中存储了多少?你的动画有多快(timePerFrame)?您是否尝试隔离使用纹理制作动画的代码,以确保没有其他东西会导致初始滞后(声音会在初始加载时产生滞后)。 stackoverflow.com/questions/28041605/…
-
如果您不保留对它的引用,SK 可能会决定将其从内存中转储。
-
感谢您的回复。每个纹理的大小为 640x640,共有 39 个单独的纹理。它们被设计成适合一张 2048x2048 的纸张,并且边缘周围有很多空白空间。即使我不调用动画而只是尝试使用其中一种纹理,它仍然会出现初始滞后。我以 swift 1.2 的方式在单例中保留对它的引用。类 GameTextures { 静态让 sharedInstance = GameTextures(); var 爆炸图集:SKTextureAtlas; } init() {self.explosionAtlas = SKTextureAtlas(named: "Explosion")}
-
不要使用单例,这种设计模式定义为内存泄漏。将 SKTexture 的引用挂在场景之外,并根据场景实现加载/卸载。让 SpriteKit 管理当前加载的图集,并专注于减少应用程序中实际纹理的内存使用。您看到的加载时间是原始 PNG 被解码然后变成未压缩的纹理时,您将无法解决这个问题。
-
进一步仅供参考,您可能想看看这里提到的示例,其中包括一个非常大的 SpriteKit Fire 动画,它使用 32BPP 的 1000x1000 动画:stackoverflow.com/questions/22470907/…
标签: sprite-kit