【发布时间】:2015-06-08 00:39:32
【问题描述】:
我在游戏加载时在视图控制器中初始化大约 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 具有内置的自动内存管理系统,适用于此类情况。如果纹理数据占用太多空间,它将自动释放。我认为它不一定是纹理本身(除非你有很多),并且崩溃可能与你对这些纹理所做的事情有关。
-
听起来几乎是各种事物的组合。首先,即使您将它们放入数组中,您也可能没有重用纹理。其次,即使您调用 removeFromParent(),您仍然可以引用精灵。此外,您可能想查看您创建的数组。当您有名为 frameNumber 的变量时,它们实际上是计数等,这很难理解。您的数组可能比预期的要大得多。希望这会有所帮助。
-
谢谢大家的回答,我发现问题是我在菜单屏幕上循环运行的2个动画,而不是实际游戏中的。
标签: ios swift animation memory-management sprite-kit