我所理解的Cocos2d-x UI树

来源:互联网 发布:水泵扬程计算软件 编辑:程序博客网 时间:2024/06/12 20:42

UI树的遍历

UI树的遍历有两个重要的目的:

  1. 遍历的顺序决定了元素被绘制的顺序。
  2. 在遍历过程中实现元素的模型视图变换矩阵的计算,其计算结果供OpenGL ES渲染管线计算顶点位置。

逻辑深度

在遍历之前,先要对所有子元素按逻辑深度从小到大的顺序进行排序。

  • 使用globalZOrder也有一个限制,那就是不能对SpriteBatchNode的子元素单独设置globalZOrder。因为SpriteBatchNode将所有子元素组织成一个BatchCommand,所以SpriteBatchNode中的子元素根本没有机会应用globalZOrder。
  • 在Cocos2d-x 3.0中,元素的绘制顺序还影响着事件的分发顺序,一个事件的接收者可以与一个元素相关联,最终所有的接收者按与元素绘制的相反顺序被分发。

模型变换矩阵

Node维护了一个模型视图变换矩阵,这个矩阵由父级的模型视图变换矩阵右乘当前节点在本地坐标系中的变换矩阵得到。在遍历的时候,根节点的变换矩阵为单位矩阵,依次向下传入自身的模型视图变换矩阵来计算子元素的模型视图变换矩阵。最后,这个变换矩阵连同元素相对坐标被传入OpenGL ES渲染管线。
每个元素的模型视图矩阵的计算只有在场景中某些元素位置发生变更时才会重新进行,这里主要指自身的位置发生了变化,或者父级链上某个元素的位置发生了变化,这能够大大提升遍历性能。

运行时游戏对象

UI树还必须提供运行时元素的查找功能,Cocos2d-x通过给一个Node对象设定标签来查找它们。Cocos2d-x之所以没有提供更易读的字符串来标识一个元素,仍然是出于对性能的考虑——游戏运行中需要高速返回游戏对象,而比较一个整型比比较一个字符串的速度要快得多。

Cocos2d-x只提供在当前的子元素中查找元素的功能,这使得程序员必须依赖一定的逻辑关系来查找运行时的元素,有时会显得不够灵活。

UI元素与内存管理

  • 为了便于内存管理,Cocos2d-x中所有的UI元素都实现了相关的create()静态方法以返回一个autorelease对象。
  • 当我们将其加入UI树中时,Node使用Cocos2d-x自身提供的Vector来存放子元素,Vector对插入的元素执行retain()方法,并在移除的时候执行release()方法。

如果我们想从一个父元素移动到另一个父元素,这时我们需要将被移除的元素转换为一个新的autorelease对象,并且通过引用计数临时加1,防止对象在被移出UI树的时候释放。

0 0
原创粉丝点击