【发布时间】: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