【问题标题】:How do I get rid of SKTextures?如何摆脱 SKTextures?
【发布时间】:2014-01-28 07:16:52
【问题描述】:

也许这很容易,但我迷路了。

我有一个项目,我必须制作一个使用 8 jpg 的全屏动画来模拟页面打开。所以我正在做的是:

  • 我有一个全屏显示的 SKSpriteNode
  • 制作一个包含 8 个 SKTexture 的数组
  • 使用 SKTexture preloadTextures 加载它们
  • 加载后,我使用 animateWithTextures 来显示动画
  • 稍后,另一种方法将 SKSpriteNode 从场景中移除。

当我第一次翻页时,它使用了大量内存,但是当我对其运行 removeFromParent 时,内存继续使用。

我的 .m 文件在顶部声明了这一点:

SKSpriteNode *pageTurnNode;

因为我希望能够在这两种方法中轻松引用它。

我如何摆脱所有这些纹理等等?

【问题讨论】:

  • 你还有 8 个 SKTexture 的数组,对吗?需要查看您的代码才能确定,但​​只要该数组存在,仍然存在对这些纹理的引用。
  • 是的,我没提,但是我确实在使用后立即放了[arrayName removeAllObjects]。

标签: sprite-kit sktextureatlas


【解决方案1】:

我觉得这似乎很有价值,并且与这个问题有关。

+textureWithImageNamed 分配的底层内存:可能也可能 切换到新的 SKScene 时不会(通常不会)发布。你 不能依赖于此。 iOS 释放缓存的内存 +textureWithImageNamed: 或 +imageNamed: 当它认为合适时,例如当它检测到内存不足时。

如果您希望在完成后立即释放内存 纹理,你必须避免使用+textureWithImageNamed:/+imageNamed:。 创建 SKTextures 的替代方法是:

  1. 使用 +imageWithContentsOfFile 创建 UIImages:
  2. 通过调用 SKTexture/+textureWithImage:(UIImage*) 从生成的 UIImage 对象创建 SKTextures。

从这个答案中得出: iOS 7 Sprite Kit freeing up memory

【讨论】:

    【解决方案2】:

    纹理可能不会立即从内存中释放。显然 Sprite Kit 采用了缓存系统。它会在认为合适时删除缓存的纹理。

    那和@prototypical 所说的。

    【讨论】:

    • 我想这是正确的,但它很奇怪,因为它基本上从不删除缓存的纹理,或者至少在应用程序崩溃之前不会删除(因为其他东西被放入内存中)。不知道我能做什么,在这种情况下可能不使用 ARC 什么的。
    • 你确定崩溃是基于内存的吗?你没有在你的问题中提到崩溃。您是否一直在制作新的翻页动画?
    • 崩溃是由于内存不足,问题是一旦我加载了这个动画,我的内存使用就会被推到边缘。然后,如果我再添加一些使用一些内存的东西,那就是它崩溃的时候。
    猜你喜欢
    • 2013-10-31
    • 2020-10-19
    • 2019-12-01
    • 2013-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多