ios - Sprite 套件,从内存中移除动画纹理

标签 ios swift animation memory-management sprite-kit

我在游戏加载时在我的 View Controller 中初始化了大约 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 并检查内存泄漏。

关于ios - Sprite 套件,从内存中移除动画纹理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29423444/

相关文章:

ios - 是否可以创建从右到左过渡的自定义 Segue

javascript - 如何为 ng Show/ng Hide 制作动画(动画)

ios - 应用程序中的非公共(public)选择器?

ios - Swift:将 pdf 文件读入 pdf 应用程序阅读器

swift - 非最终类无法满足协议(protocol)要求,因为它在非参数、非结果类型中使用 'Self'

jQueryRotate - IE8 中的问题

css - 调整 "ul hover"上的图片大小

ios - 如何更改 UIPickerView 的背景颜色?

ios - 获取 ScrollView 中图像的标签

ios - BlocksKit 和 Xcode 4.5