我正在 iOS Swift 中设计一款游戏。
我有一个大约 100 个 1920x1080p PNG 的大型纹理图集。当我调用这些函数时,它会由于内存压力而导致应用程序崩溃。当我禁用该功能时,我的应用程序运行得很好。
我可以通过编辑代码来防止这种崩溃吗?还是我的纹理图集太大了?
Code:
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")
}
即使您以某种方式优化纹理(例如,改变纹理格式 https://stackoverflow.com/a/29112351/3402095)。如果使用标准 RGBA8888 格式存储在 RAM 内存中,则 1920x1080px 纹理占用约 8 MB,正如您所说,因为设备内存限制 https://stackoverflow.com/a/15200855/3402095,应用程序会在某个时候崩溃。
在这种情况下,如果你的动画允许你这样做,一个好方法是制作一段视频的,然后使用SK视频节点 https://developer.apple.com/library/prerelease/ios/documentation/SpriteKit/Reference/SKVideoNode/index.html来玩它。文档中甚至建议这样做,因为在某些情况下使用纹理可能会很昂贵:
与任何其他节点一样,您可以将电影节点放置在
节点树和 Sprite Kit 将正确渲染它。例如,你
可能会使用视频节点来动画化一些视觉行为
使用纹理集合来定义的成本很高。
这对于背景动画、过场动画、介绍......来说是一种合适的方式。
要循环播放视频,您可以使用 AVPlayer用它初始化 SKVideoNode https://developer.apple.com/library/ios/documentation/SpriteKit/Reference/SKVideoNode/index.html#//apple_ref/occ/instm/SKVideoNode/initWithAVPlayer:。阅读更多here https://stackoverflow.com/a/28816458/3402095。我建议您这样做,因为 SKVideoNode 仅限于用于控制视频播放的 play() 和pause() 方法。
希望这有帮助并有意义!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)