cocos2dx——節點的排序原理(sortAllChildren)

                       (如有錯誤請聯繫我更正,以免誤導他人!)

       在《cocos2dx——節點的渲染(繪製)順序LocalZOrder、GlobalZOrder、OrderOfArrival》(詳情見:http://blog.csdn.net/qq_28290581/article/details/52165343)一文的最後,break還留下一個疑問:當LocalZOrder、GlobalZOrder、OrderOfArrival三值相等時,節點的渲染(繪製)順序是怎麼樣的呢?

那麼本文,break就將自己尋找到的答案與尋找的過程與大家分享。

       說到cocos2dx中節點的繪製順序呢,我們不得不瞭解下sortAllChildren這個函數。老規矩,我們來看下源碼註釋:
      Sorts the children array once before drawing, instead of every time when a child is added or reordered.

      在繪製之前給孩子數組(Node的成員變量_children,類型爲:Vector<Node*>)排序一次,而不是在每次添加孩子節點或者重排孩子節點的時候。
      This approach can improves the performance massively.

     
這種方法可以大大改善性能。

      那麼,cocos2dx到底是怎麼給節點排序的呢?

void Node::sortAllChildren()
{
    if (_reorderChildDirty)
    {
        std::sort(std::begin(_children), std::end(_children), nodeComparisonLess);
        _reorderChildDirty = false;
    }
}

這是sortAllChildren函數的源碼。

我們看到if語句下的第一行代碼

std::sort(std::begin(_children), std::end(_children), nodeComparisonLess);

我們看到sortAllChildren實際上是調用了STL的庫函數sort來對孩子節點排序的。


sort函數大致原理:其中第一個參數和第二個參數告訴了sort函數排序的數據範圍是從_children數組的頭到_children的尾(std::begin(_children)—std::end(_children)-1(std::end(_children)指向的是_children數組尾部的下一個位置))。第三個參數是一個指向帶兩個參數的函數的指針,該函數告訴sort函數按怎樣的順序進行排序,如果該函數中第一個參數排在第二個參數前面該函數返回true。


那麼我們來看下nodeComparisonLess函數的實現:

bool nodeComparisonLess(Node* n1, Node* n2)
{
    return( n1->getLocalZOrder() < n2->getLocalZOrder() ||
           ( n1->getLocalZOrder() == n2->getLocalZOrder() && n1->getOrderOfArrival() < n2->getOrderOfArrival() )
           );
}

我們可以看到nodeComparisonLess函數根據節點(Node)的LocalZOrder和OrderOfArrival值來決定兩個節點的先後順序:

1、LocalZOrder值小的排在前面

2、LocalZOrder值相等時OrderOfArrival值小的排在前面

3丶當LocalZOrder值和OrderOfArrival值都相等時函數return false,這就意味着,先加入的節點會排在前面。

4丶當兩節點的GlobalZOrder值不相等時LocalZOrder、OrderOfArrival值在渲染順序中不起作用(詳情見:《cocos2dx——節點的渲染(繪製)順序LocalZOrder、GlobalZOrder、OrderOfArrival》http://blog.csdn.net/qq_28290581/article/details/52165343)。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章