cocos2dx使用localZOrder来表示元素的逻辑深度,UI树的遍历使用中序(in-order)的深度优先算法进行遍历
中序遍历顺序:
1.遍历左边的子节点,2.遍历根节点,3.遍历右边的子节点
主要用于遍历二叉树(cocos2dx 按元素的层级关系来组织一棵“二叉树”,左子节点表示所有逻辑深度小于0的子元素,右子节点表示所有逻辑深度大于或等于0的子元素)
tips:UI在遍历的时候,如果元素的位置不发生变化,则不会对每帧计算模型视图变化矩阵
cocos2dx 3.0新增globalZOrder
新的判断逻辑:
1,默认每个元素的globalZOrder值为0.
2,如果一个元素的globalZOrder值不为0,则按globalZOrder值进行排序
3,否则,则按localZOrder值进行排序
内存管理
将子元素添加进UI树时,Node使用Vector<T>来存放
重用元素Tip:
从一个父元素移动到另一个父元素,需要将其转换为一个新的autorelease对象,并且要防止对象在被移出UI树时被释放
auto node = parent-> getchildbytag(10); //引用计数为1
node->retain(); //增加引用计数防止被释放,引用计数为2
node->removefromparent(); // 计数为1
node->autorelease; //加入池
parent2->addchild(node); //引用计数为2
当前帧结束后,引用计数变为1
全局 Z 值
-
Node 增加了新的函数 setGlobalZOrder() / getGlobalZOrder() 。
-
setZOrder() / getZOrder() 被替代为 setLocalZOrder() / getLocalZOrder() 。
-
globalZOrder 是一个float(不是int)的参数。这个值在渲染器中用来给RenderCommand排序。较低的值拥有较高的优先级。这意味着一个globalZorder为-10的节点会比一个globalZOrder为10 的节点优先绘制。
-
globalZOrder 为 0 (默认值)的节点将会根据 Scene Graph 顺序绘制。
-
如果 globalZOrder 不变的话,Cocos2d-x v3.0 和 Cocos2d-x v2.2 行为一致。
-
globalZOrder() 和 localZOrder():
* globalZOrder是用于渲染器中用来给“绘制命令”排序的
* localZOrder是用于父节点的子节点数组中给节点对象排序的