1. 程式人生 > >unigine NodeReference

unigine NodeReference

測試使用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的節點,需要在下一幀才會進入到更新列表中。