UI树

来源:互联网 发布:windows界面开发主流 编辑:程序博客网 时间:2024/06/02 20:53
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是用于父节点的子节点数组中给节点对象排序的
0 0