渲染系统是游戏引擎里面最重要的一个模块之一了,如何遍历UI树,如何将UI合理的渲染在屏幕上,如何选择渲染的顺序,这是渲染系统最需要考虑的。其实遍历的顺序就决定了渲染的顺序。
Cocos2d-x的渲染函数是通过Node::visit来进行的,首先看看这个函数干了什么吧
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
|
@H_404_90@
void
Node::visit(Renderer*renderer,
const
Mat4&parentTransform,uint32_tparentFlags)
{
//quickreturnifnotvisible.childrenwon'tbedrawn.
if
(!_visible)
{
return
;
}
uint32_tflags=processParentFlags(parentTransform,parentFlags);
bool
visibleByCamera=isVisitableByVisitingCamera();
int
i=0;
(!_children.empty())
{
sortAllChildren();
//drawchildrenzOrder<0
for
(;i<_children.size();i++)
{
autonode=_children.at(i);
(node&&node->_localZOrder<0)
node->visit(renderer,_modelViewTransform,flags);
else
break
;
}
//selfdraw
(visibleByCamera)
this
->draw(renderer,flags);
(autoit=_children.cbegin()+i;it!=_children.cend();++it)
(*it)->visit(renderer,flags);
}
else
(visibleByCamera)
{
}
|
然后可以开始一步一步分析代码了,首先快速去掉不可见的元素,并且不绘制它的子元素。_visible的判断就干了这件事情。
然后判断子节点是否为空,子节点为空的判断是否在摄像机可视范围内,只有在可视范围内才进行绘制,如下:
(visibleByCamera)
|