cocos2dx的渲染顺序是由渲染树来决定的。渲染树是由各种游戏元素按照层次关系构成的树结构,表示Cocos2d-x游戏的绘制层次。
由导演类Director控制渲染树的根节点场景Scene,场景中包含层Layer,层Layer中又包含精灵等。
层次关系如图:
按照官网开发者指南中的说法,所有节点都是存储在一个场景图_scene graph_中,_scene graph_是一个用来存储场景图形的数据结构,其实是一个树形结构。
可以通过API中的addChild()方法来创建_scene graph_场景。
在对节点之间添加调用addchild(node,Zorder,tag)的时候,就把该子节点添加到该父节点的子树中,ZOrder决定了子节点是在父节点左边的子树还是右边的子树。没有设置ZOrder的会按照添加的前后顺序决定渲染次序。
对_scene graph_进行遍历的时候,cocos2dx采用了_in-order walk_算法(按顺序)。类似于二叉树的中根遍历,先遍历左子树,然后访问根结点,最后遍历右子树。所以ZOrder值小的先渲染,ZOrder值大的后渲染,最右边的子树会最后显示到场景中,在所有节点的最上面。
接着从代码中看一下cocos2dx的渲染结构。
游戏程序从win32目录下的main.cpp开始运行
int APIENTRY _tWinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
UNREFERENCED_PARAMETER(hPrevInstance);
UNREFERENCED_PARAMETER(lpCmdLine);
// create the application instance
AppDelegate app;
return Application::getInstance()->run();
}
运行Application单例的run方法。继续追踪run方法
int Application::run()
{
......
while(!glview->windowShouldClose())
{
QueryPerformanceCounter(&nNow);
if (nNow.QuadPart - nLast.QuadPart > _animationInterval.QuadPart)
{
nLast.QuadPart = nNow.QuadPart;
director->mainLoop();
glview->pollEvents();
}
else
{
Sleep(0);
}
}
......
}
通过导演类来运行mainLoop方法。
void DisplayLinkDirector::mainLoop()
{
if (_purgeDirectorInNextLoop)
{
_purgeDirectorInNextLoop = false;
purgeDirector();
}
else