unigine NodeReference

28 篇文章 6 订阅

测试使用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的节点,需要在下一帧才会进入到更新列表中。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值