(如有錯誤請聯繫我更正,以免誤導他人!)
在《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)。