Memory SpriteKit SKTexture.preload纹理内存使用率高

Memory SpriteKit SKTexture.preload纹理内存使用率高,memory,sprite-kit,skaction,Memory,Sprite Kit,Skaction,我有一个SKTextureAtlas,有大约90个PNG图像。每幅图像的分辨率为2000 x 70像素,大小约为1 KB 现在我将地图册中的这些图像放入如下数组: var dropBarAtlas = SKTextureAtlas(named: "DropBar") for i in 0..<dropBarAtlas.textureNames.count{ var textuteName = NSString(format: "DropBar%i", i)

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

现在我将地图册中的这些图像放入如下数组:

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)
   }
要以每秒30帧的速度播放动画,我使用SKAction.animateWithTextures

var animateDropBar = SKAction.animateWithTextures(dropFrames, timePerFrame: 0.033)
dropBar.runAction(animateDropBar)
我的问题是,当我预加载纹理时,内存使用量增加到大约300 MB。 是否有更高性能的解决方案?

建议SKAction.animateWithTextures使用哪种帧速率和图像大小?

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

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

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


所以你能做的就是优化你的纹理,使用不同的纹理格式。这是关于纹理的另一个例子。

对于2016+读者,您应该在SpriteKit和GameplayKit上查看WWDC 2015视频。简短版本:Xcode纹理地图集已经对您的图像进行了大量优化,iOS 9的应用程序切片技术意味着您的应用程序用户将自动只接收设备所需的图形资源。e、 g.iPhone 5s用户只能下载X2分辨率的图像,而不能下载X1或X3分辨率的图像。此外,iOS会在使用纹理后自动缓存纹理。(虽然也有预加载纹理的方法。)问题在于,您无法同时将这么多图像解码到主内存中。还有一些更高级的动画,它们不能同时在内存中保存所有解码的字节。有关有效的SpriteKit纹理压缩的示例,请参见此答案
var animateDropBar = SKAction.animateWithTextures(dropFrames, timePerFrame: 0.033)
dropBar.runAction(animateDropBar)