由于内存压力,大纹理图谱会导致终止

我正在iOS Swift中devise一个游戏。

我有一个大约100 1920×1080 PNG的纹理 – 地图集。 当我调用这些函数时,由于内存压力,它会崩溃应用程序。 当我禁用function,我的应用程序运行得很好。

我可以通过编辑我的代码来防止这种崩溃,或者我的纹理 – 图集太大了吗?

码:

var waterWave: SKSpriteNode! var waterWalkingFrames : [SKTexture]! func addWater() { let waterAnimatedAtlas = SKTextureAtlas(named: "water.atlas") var waterFrames = [SKTexture]() let numImages = waterAnimatedAtlas.textureNames.count for var i=0; i<numImages; i++ { let waterTextureName = "water_000\(i)" waterFrames.append(waterAnimatedAtlas.textureNamed(waterTextureName)) } self.waterWalkingFrames = waterFrames let firstFrame = waterWalkingFrames[0] self.water = SKSpriteNode(texture: firstFrame) self.water.anchorPoint = CGPointMake(0.5, 0.5) self.water.position = CGPointMake(CGRectGetMidX(self.frame), self.runningBar.position.y + (self.runningBar.size.height / 2) + 5) self.water.size.width = self.frame.size.width self.water.size.height = self.frame.size.height self.water.zPosition = 7 self.addChild(self.water) waterAnimation() } func waterAnimation() { self.water.runAction(SKAction.repeatActionForever( SKAction.animateWithTextures(waterWalkingFrames, timePerFrame: (1 / 60), resize: false, restore: true)), withKey:"surferBasic") } 

即使以某种方式优化纹理(例如更改纹理格式 ),这样的animation也总是很昂贵。 如果使用标准的RGBA8888格式存储在RAM内存中,1920×1080像素的纹理占用大约8兆字节,正如您所说的那样,由于设备内存限制 ,应用程序会在某个时候崩溃。

在这种情况下,如果您的animation允许您这样做,一个好方法是制作一个video ,然后使用SKVideoNode播放它。 这在文档中甚至是推荐的,只是因为在某些情况下使用纹理可能很昂贵:

像其他任何节点一样,您可以将电影节点放置在节点树内的任何位置,并且Sprite Kit将正确渲染它。 例如,您可以使用video节点为一些视觉行为制作animation,这些视觉行为使用一组纹理进行定义会很昂贵。

这将是一个适当的方式为背景animation,剪切场景,介绍…

对于循环播放video,您可以使用AVPlayer来初始化SKVideoNode 。 在这里阅读更多。 我build议你这样做,因为SKVideoNode仅限于播放()和暂停()方法来控制video播放。

希望这有助于和理解!