我正在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")
}
答案 0 :(得分:1)
即使您以某种方式优化纹理(例如changing texture format),这样的动画总是很昂贵。如果使用标准RGBA8888格式存储在RAM内存中,1920x1080px纹理占用大约8兆字节,正如您所说,由于device memory limitation,应用程序将在某些时候崩溃。
在这种情况下,如果你的动画允许你这样做,一个好方法是制作视频,然后使用SKVideoNode来播放它。这甚至在文档中推荐,因为在某些情况下使用纹理可能很昂贵:
与任何其他节点一样,您可以将影片节点放在其中的任何位置 节点树和Sprite Kit将正确呈现它。例如,你 可能会使用视频节点来动画一些可能的视觉行为 使用纹理集合定义很昂贵。
这适用于背景动画,剪辑场景,前奏......
要循环播放视频,您可以将AVPlayer用于initialize SKVideoNode with it。阅读更多here。我建议你这样做,因为SKVideoNode仅限于play()和pause()方法来控制视频播放。
希望这会有所帮助并且有所帮助!