大纹理图集因内存压力导致终止

时间:2015-05-31 08:21:24

标签: ios swift sprite-kit

我正在iOS Swift中设计游戏。

我有一个大约100个1920x1080p PNG的大纹理图集。当我调用这些函数时,由于内存压力,它会崩溃应用程序。当我禁用该功能时,我的应用运行正常。

我可以通过编辑代码来防止此崩溃,还是我的纹理图集太大了?

代码:

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")
}

1 个答案:

答案 0 :(得分:1)

即使您以某种方式优化纹理(例如changing texture format),这样的动画总是很昂贵。如果使用标准RGBA8888格式存储在RAM内存中,1920x1080px纹理占用大约8兆字节,正如您所说,由于device memory limitation,应用程序将在某些时候崩溃。

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

  

与任何其他节点一样,您可以将影片节点放在其中的任何位置   节点树和Sprite Kit将正确呈现它。例如,你   可能会使用视频节点来动画一些可能的视觉行为   使用纹理集合定义很昂贵。

这适用于背景动画,剪辑场景,前奏......

要循环播放视频,您可以将AVPlayer用于initialize SKVideoNode with it。阅读更多here。我建议你这样做,因为SKVideoNode仅限于play()和pause()方法来控制视频播放。

希望这会有所帮助并且有所帮助!