使用 swift 的场景套件内存管理
scene kit memory management using swift
我对如何使用 swift 释放场景工具包中的内存感到困惑。每当我从 collada 文件创建 SCNNode 时,它都会导入几何体,创建物理对象,并从 jpg 文件设置 material。由于某种原因(即使文件大小低于 300k),这在创建新对象时会占用 10 mb 的内存,但无论如何。每当它从父节点中删除时,零内存就会释放出来,我不明白为什么。我可以使用什么代码来真正删除对象?我找不到有关该主题的任何文档。这只是一个一般性的问题,所以这里不需要代码。
如果节点对其有强引用,ARC 将不会释放它。您可以将节点的声明切换为 'weak' 属性 或将对该节点的任何强引用设置为 nil。由于 'strong' 和 'weak' 的不同行为,更改为弱修复。虽然对象具有强引用(简单的 var 或 let 自动成为强引用),但即使您使用 removeFromParent 函数,它也不会从内存中取出。
所以我发现我需要做的是将游戏对象的纹理设置为 nil,然后再将它们从父对象中移除。作为一般规则,在删除节点之前,我开始将所有纹理设置为 nil。无论如何,这解决了我的记忆问题。
我对如何使用 swift 释放场景工具包中的内存感到困惑。每当我从 collada 文件创建 SCNNode 时,它都会导入几何体,创建物理对象,并从 jpg 文件设置 material。由于某种原因(即使文件大小低于 300k),这在创建新对象时会占用 10 mb 的内存,但无论如何。每当它从父节点中删除时,零内存就会释放出来,我不明白为什么。我可以使用什么代码来真正删除对象?我找不到有关该主题的任何文档。这只是一个一般性的问题,所以这里不需要代码。
如果节点对其有强引用,ARC 将不会释放它。您可以将节点的声明切换为 'weak' 属性 或将对该节点的任何强引用设置为 nil。由于 'strong' 和 'weak' 的不同行为,更改为弱修复。虽然对象具有强引用(简单的 var 或 let 自动成为强引用),但即使您使用 removeFromParent 函数,它也不会从内存中取出。
所以我发现我需要做的是将游戏对象的纹理设置为 nil,然后再将它们从父对象中移除。作为一般规则,在删除节点之前,我开始将所有纹理设置为 nil。无论如何,这解决了我的记忆问题。