Sprite 套件,从内存中移除动画纹理
Sprite kit, remove animated textures from memory
我在游戏加载时在我的视图控制器中初始化了大约 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 和 4 秒时使游戏崩溃。
有谁知道我如何才能真正从内存中删除该动画,以便在不再需要它时它不会占用 space?
SpriteKit使用自己的缓存机制,您无法自行清除缓存。
从您所说的情况来看,您的代码中似乎存在内存泄漏。请记住,您需要删除纹理的所有引用才能被 ARC 释放。
在您的情况下,从父级移除纹理是不够的,因为纹理存储在数组中。您需要从数组中删除所有纹理并且没有其他对它们的引用才能正确释放它们。
450MB+ 对于几个纹理来说绝对太多了。我建议你 运行 仪器并检查内存泄漏。
我在游戏加载时在我的视图控制器中初始化了大约 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 和 4 秒时使游戏崩溃。
有谁知道我如何才能真正从内存中删除该动画,以便在不再需要它时它不会占用 space?
SpriteKit使用自己的缓存机制,您无法自行清除缓存。
从您所说的情况来看,您的代码中似乎存在内存泄漏。请记住,您需要删除纹理的所有引用才能被 ARC 释放。
在您的情况下,从父级移除纹理是不够的,因为纹理存储在数组中。您需要从数组中删除所有纹理并且没有其他对它们的引用才能正确释放它们。
450MB+ 对于几个纹理来说绝对太多了。我建议你 运行 仪器并检查内存泄漏。