【问题标题】:How to release memory created by SKTexture如何释放 SKTexture 创建的内存
【发布时间】:2016-08-03 22:17:41
【问题描述】:

我有一个使用以下内容创建场景套件纹理的应用程序:

        let texture = SKTexture(image: image)

问题是多次调用后,应用程序由于内存不足而崩溃。

我真的只需要最近创建的纹理,因此在创建新纹理时,可以释放预览的内存,但是,即使不再使用它们,Scene Kit 似乎也会保留这些纹理(节点不再是场景的一部分)。

如何手动告诉 Scene Kit 释放纹理的内存和缓存,以免陷入低内存崩溃的情况?

另外,我知道 SceneKit 文档建议通过删除节点等来删除对纹理的所有引用,但这应该会发生,但纹理没有被释放。有没有很好的调试方法并查看引用的内容?

在重新审查代码时,我正在创建一个场景来保存要在主场景中渲染的图像(其节点不会改变)。基本上,场景中有一个对象可以显示图像或视频,并通过返回用作材质漫反射内容的场景来更改。

let texture = SKTexture(image: image)
let sprite = SKSpriteNode(texture: texture)
let scene = SKScene(size: sprite.size)
sprite.position = CGPointMake(CGRectGetMidX(scene.frame), CGRectGetMidY(scene.frame));
scene.addChild(sprite)

然后在这里使用:

primaryObjectMaterial.diffuse.contents = scene

我希望一旦场景的节点材质内容发生变化,这个场景(以及纹理和图像)将被释放,因为不再有任何对它的引用,但缓存系统可能挂在某些东西上,或者我正在做错了什么?

【问题讨论】:

  • 我知道你把节点放在哪里,节点不再是场景的一部分,但你实际上是在删除节点吗?
  • @Oleksii:该链接建议不要使用我正在做的 imageNamed。
  • @Timmy:他们很可能被困在某个地方。我怎么知道?我正在重用相同的鼻子,但替换了我认为会通过 ARC 释放以前的纹理的纹理,因为应该不再引用它们,但也许 SceneKit 在某个地方保留了它们?也许我应该持有一个参考并以某种方式手动破坏纹理?

标签: ios swift out-of-memory scenekit


【解决方案1】:

如果不查看您的代码或不知道应用程序如何工作,很难给您一个准确的答案,但您需要获取纹理所在的节点并将其移除

nameOfNode.removeFromParentNode

这会将其从内存中删除,您需要使用新纹理添加一个新节点。

【讨论】:

  • 问题是节点没有被删除。我只是改变材料的内容。素材内容可以是图像或视频,这就是素材内容是其自己的场景的原因。在创建替换场景之前保留对该场景的引用并以某种方式手动销毁它会更好吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-10-29
  • 1970-01-01
  • 1970-01-01
  • 2014-12-11
  • 2011-01-31
相关资源
最近更新 更多