2016-08-03 59 views
0

创建我有一个用下面创建现场套件纹理的应用程序内存:如何释放由SKTexture

 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 

我希望一次场景的节点材料内容被改变,这一幕(和纹理和图像)将被释放,因为不再是任何对它的引用,但也许缓存系统挂在某些东西上,或者我做错了什么?

+0

http://stackoverflow.com/questions/21025295/how-do-i-get-rid-of-sktextures –

+0

我看到你放在哪里,节点不再是场景的一部分,但你实际上是删除节点? –

+0

@ Oleksii:该链接建议不使用imageNamed,这是我正在做的。 – Gujamin

回答

0

很难给你不再看到你的代码或知道如何应用程序是否运行一个确切的答案,但你需要采取质感上的节点,将其取下

nameOfNode.removeFromParentNode 

这将删除内存,并且您需要添加具有新纹理的新节点。

+0

事情是节点没有被删除。我只是改变材料的内容。素材内容可以是图片或视频,这就是为什么素材内容是自己的场景。在创建替换场景之前,坚持引用该场景并以某种方式手动销毁它会更好吗? – Gujamin