SpriteKit SKTexture.preloadTextures 高内存使用率 Swift

SpriteKit SKTexture.preloadTextures high memory usage Swift

我有一个包含大约 90 个 PNG 图像的 SKTextureAtlas。每张图片的分辨率为 2000 x 70 像素,大小约为 1 KB。

现在我将来自 Atlas 的这些图像放入这样的数组中:

var dropBarAtlas = SKTextureAtlas(named: "DropBar")

for i in 0..<dropBarAtlas.textureNames.count{
        var textuteName = NSString(format: "DropBar%i", i)
        var texture = dropBarAtlas.textureNamed(textuteName)
        dropFrames.addObject(texture)
   }

然后我用 didMoveToView 中的纹理预加载数组:

SKTexture.preloadTextures(dropFrames, withCompletionHandler: { () -> Void in})

要以 30 fps 播放动画,我使用 SKAction.animateWithTextures

var animateDropBar = SKAction.animateWithTextures(dropFrames, timePerFrame: 0.033)
dropBar.runAction(animateDropBar)

我的问题是,当我预加载纹理时,内存使用量增加到大约 300 MB。 有没有更高效的解决方案?
SKAction.animateWithTextures推荐使用哪种帧率和图像尺寸?

您应该记住,图像文件大小(在您的示例中为 1Kb)与将同一图像存储在 RAM 中所需的内存量无关。您可以使用以下公式计算所需的内存量:

宽度 x 高度 x 每像素字节数 = 内存大小

如果您使用标准的 RGBA8888 像素格式,这意味着您的图像将需要大约 0.5 兆字节的 RAM 内存,因为 RGBA8888 每个像素使用 4 个字节 – 红色、绿色、蓝色各占 1 个字节,alpha 透明度占 1 个字节.您可以阅读更多 here.

所以您可以做的是优化纹理并使用不同的纹理格式。这是另一个关于纹理 optimization.

的例子