精灵套件,从内存中移除动画纹理



我在游戏加载时在视图控制器中初始化了大约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并检查内存泄漏。

最新更新