测试使用unigine版本 Unigine2.3.1
Unigine NodeReference是内部类, 用于导入unigine特有的内部的node文件。
用NodeReference添加节点后,经常可能会出现 删除节点失败的现象。
如下为我的node 文件结构
node Reference导入后,产生一个通过getReference 或者detachReference,能获取到对应的节点。getReference方式获取的节点,在NodeReference对象被销毁时而被销毁(如果有node保存getReference()的值,则不能对该node调用grab函数,这个问题会导致crash)。正确使用方式应该如下三种:
方式1:
NodeReferencePtr ref = NodeReference::create(path);//此处可以将ref定义成全局变量或者交给editor来管理
ref->release();
//Editor::get()->addNode(ref);
NodePtr node = ref->getReference();//如果通过getReference拿到的Node对象,不能进行grab操作。
方式2:
NodeReferencePtr ref = NodeReference::create(path);
NodePtr node = ref->getReference->clone();//此处可以将node定义成全局变量或者交给editor来管理
node.release();
方式3:
NodeReferencePtr ref = NodeReference::create(path);
NodePtr node = ref->detachReference();//可以将node定义成全局变量或者交给editor来管理。
node.release();
而对于拿到独立node 对象后,释放 对象也需要注意,需要递归让子对象获取owner权限。
如下:
for (int i = 0; i < m_node->getNumChildren(); i++)
{
m_node->getChild(i)->grab();
}
m_node->grab();
m_node.destroy();
对于NodeReference对象, 记住先将其通过getreference拿到的node对象进行release操作,对node对象调用destroy()。然后对nodereference对象直接grab(),destroy()。
可以通过如下代码来查看engine对对象的管理:
if (App::get()->clearKeyState('/'))
{
Log::message("e editor num:%d,worldNodeNum:%d,%d,%d\n", Editor::get()->getNumNodes(), World::get()->getNumUpdateNodes(), World::get()->getNumQueuedNodes(), World::get()->getNumQueuedResources());
for (int i = 0; i < World::get()->getNumUpdateNodes(); i++)
{
Log::message("e%d\n", World::get()->getUpdateNode(i)->getID());
}
}
会发现create的节点,需要在下一帧才会进入到更新列表中。