我在游戏加载时在视图控制器中初始化了大约30个动画纹理,如下所示:
for i=0; i<atlasName.count; i++ {
frameNumber = animationTextures.animationTextureAtlas[i].textureNames.count
firstFrameName = "(atlasName[i])1"
animationTextures.animationFrames.append([animationTextures.animationTextureAtlas[i].textureNamed(firstFrameName)])
for j=2; j<=frameNumber; j++ {
var frameName = "(atlasName[i])(j)"
animationTextures.animationFrames[i].append(animationTextures.animationTextureAtlas[i].textureNamed(frameName))
}
animationTextures.firstFrame.append(animationTextures.animationFrames[i][0])
}
基本上,我把所有的动画都放在一个数组中,这样我就可以很容易地访问它们。
在游戏中,这些动画中的每一个都会出现很短的时间,当我不需要它们时,我会使用.removeFromParent()删除它,但问题是它仍然保留在设备的内存中,因此,一旦大约15-20个动画出现在游戏中并进入内存,它就会达到大约450-500MB,并在iPhone 4和4s上崩溃游戏。
有人知道我如何才能真正将动画从内存中删除,这样它就不会在不再需要时占用空间吗?
SpriteKit利用自己的缓存机制,您无法自己清除缓存。
从您所说的内容来看,您的代码中似乎有内存泄漏。请记住,您需要删除纹理的所有引用才能被ARC解除分配。
在您的情况下,仅从父对象中删除纹理是不够的,因为纹理存储在阵列中。您需要从阵列中删除所有纹理,并且没有其他对它们的引用,才能正确释放它们。
450MB+对于几个纹理来说绝对太多了。我建议您运行Instruments并检查内存泄漏。