如何从场景中删除 SCNNode 并释放 Xamarin 中的内存 iOS
How to remove SCNNode from the scene and free up memory in Xamarin iOS
RemoveFromParentNode() 仅从父节点中删除节点 node/scene 但不会从内存中删除它,因为在执行该行后您仍然可以引用该节点。
我想知道我们如何从内存中完全删除节点,将节点设置为 null 对变量没有影响,您可以从下面的代码中看到。
我见过的大多数解决方案都在 swift 中,但我在 Xamarin.iOS C#
中找不到解决方案
var myNode = new SCNNode
{
Name = "My Node"
};
SView.Scene.RootNode.Add(myNode);
SView.Scene.RootNode.EnumerateChildNodes((SCNNode node, out bool stop) =>
{
node.RemoveFromParentNode();
node = null; // Does nothing
stop = false;
});
try
{
Debug.WriteLine(myNode.Name);
}
catch (NullReferenceException ex)
{
Debug.WriteLine("We already deleted myNode" + ex.Message);
}
预计捕获:"We already deleted myNode"。
实际输出:"My Node"
SCNode
是一个原生的 ObjC 对象,顶部有一个 .Net 包装器。当您分配它 null
时,它只会处理引用计数的 Xamarin.iOS/Mono 端。您需要对其调用 Dispose
以释放那些本机引用。
node.Dispose();
RemoveFromParentNode() 仅从父节点中删除节点 node/scene 但不会从内存中删除它,因为在执行该行后您仍然可以引用该节点。
我想知道我们如何从内存中完全删除节点,将节点设置为 null 对变量没有影响,您可以从下面的代码中看到。
我见过的大多数解决方案都在 swift 中,但我在 Xamarin.iOS C#
中找不到解决方案var myNode = new SCNNode
{
Name = "My Node"
};
SView.Scene.RootNode.Add(myNode);
SView.Scene.RootNode.EnumerateChildNodes((SCNNode node, out bool stop) =>
{
node.RemoveFromParentNode();
node = null; // Does nothing
stop = false;
});
try
{
Debug.WriteLine(myNode.Name);
}
catch (NullReferenceException ex)
{
Debug.WriteLine("We already deleted myNode" + ex.Message);
}
预计捕获:"We already deleted myNode"。
实际输出:"My Node"
SCNode
是一个原生的 ObjC 对象,顶部有一个 .Net 包装器。当您分配它 null
时,它只会处理引用计数的 Xamarin.iOS/Mono 端。您需要对其调用 Dispose
以释放那些本机引用。
node.Dispose();