【问题标题】:Sprite kit, remove animated textures from memorySprite 套件,从内存中删除动画纹理
【发布时间】: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


【解决方案1】:

SpriteKit 使用自己的缓存机制,您无法自行清除缓存。

根据您的说法,您的代码中似乎存在内存泄漏。请记住,您需要删除纹理的所有引用才能被 ARC 释放。

在您的情况下,从父级移除纹理是不够的,因为纹理存储在数组中。您需要从数组中删除所有纹理并且没有其他对它们的引用才能正确释放它们。

450MB+ 对于几个纹理来说绝对是太多了。我建议你运行 Instruments 并检查内存泄漏。

【讨论】:

  • 感谢您的回答,我知道您所说的关于 ARC 的内容并删除了所有引用。在搜索了内存泄漏和分配后,我发现问题实际上是在菜单屏幕上循环运行的 2 个动画。每次循环开始时,它都会分配一堆内存,当它达到大约 180MB 时就会停止。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多