如下图所示,主线程的每一帧遍历ui树的每个元素时,并不直接调用OpenGL ES进行绘制,而是将每个元素的绘制命令包装成一个RenderCommand对象发送至绘制栈,绘制栈在遍历场景中的每一个元素之后开始绘制。
Cocos2d-x提供QuadCommand、GroupCommand、BatchCommand及自定义绘制命令的CustomCommand。
上述方法优点如下。
(1)绘制命令可以被重用
将绘制命令从UI树的遍历中分离,多个不同的元素可以用相同的绘制命令进行组合,使得对引擎的维护更灵活。例如,Label,Particle及TileMap都使用BatchCommand进行绘制。
(2)渲染系统进行优化
对于相邻的绘制命令,如果他们使用相同的RenderCommand类型,并且使用相同的纹理和OpenGL ES绘制参数,渲染系统可以把他们合并成一次绘制。减少绘制次数能够提升渲染性能,在3.0中被称为自动批绘制技术(auto-batching)。
若一个场景中有100个sprite,且来自同一纹理,那么理想情况下,只需要进行一次OpenGL ES绘制命令调用,如下图所示。
(3)提升了UI树中元素绘制顺序的自由度
绘制命令是按照UI树遍历顺序发送至绘制栈的,但绘制栈可以对其进行重新排序。UI树更多的是决定元素的坐标系变换。
3.0通过给node引入globalZOrder来设定全局的绘制顺序。绘制栈优先根据globalZOrder中的设定进行排序,然后才是globalZOrder对所有RenderCommand进行排序,以决定绘制顺序,如下图所示。
(4)自动裁剪技术
3.0为Sprite引入了自动裁剪技术(auto-culling),所有在视窗外的sprite不会发送绘制命令到绘制栈。从而减少不必要的OpenGL ES绘制调用。