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)排序一次,而不是在每次添加孩子节点或者重排孩子节点的时候。
      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)。

你可能感兴趣的:(cocos2dx学习笔记)