2.x版本
一个程序的开始:我们先从main函数开始看,
return CCApplication::sharedApplication()->run();
进入改函数中,改函数中代码片段 CCApplication类是跨平台文件,不同平台的实现方式不一样,ios的是*.mm文件,里面实现死循环的方式也是调用该平台的方式,不过意思都是这样只不过,实现不同。
//一个死循环 while (1) { if (! PeekMessage(&msg,NulL,PM_REMOVE)) { // Get current time tick. queryPerformanceCounter(&nNow); // If it's the time to draw next frame,draw it,else sleep a while. if (nNow.QuadPart - nLast.QuadPart > m_nAnimationInterval.QuadPart)//当前时间间隔大于设置帧率时间调用 { nLast.QuadPart = nNow.QuadPart; CCDirector::sharedDirector()->mainLoop(); }
这里会按条件一直调用CCDirector中的mainLoop函数,进入这个函数,函数一面调用
drawScene();
drawScene 代码片段
// draw the scene if (m_pRunningScene) { m_pRunningScene->visit(); } // draw the notifications node if (m_pNotificationNode) { m_pNotificationNode->visit(); }
里面调用了visit()函数,cocos2dx所有node都继承于CCNode,我们看一下CCNode的中的visit函数
voID CCNode::visit(){ // quick return if not visible. children won't be drawn. if (!m_bVisible) { return; } kmGLPushmatrix(); if (m_pGrID && m_pGrID->isActive()) { m_pGrID->beforeDraw(); } this->transform(); CCNode* pNode = NulL; unsigned int i = 0; if(m_pChildren && m_pChildren->count() > 0) { sortAllChildren(); // draw children zOrder < 0 ccArray *arrayData = m_pChildren->data; for( ; i < arrayData->num; i++ ) { pNode = (CCNode*) arrayData->arr[i]; if ( pNode && pNode->m_nZOrder < 0 ) { pNode->visit(); } else { break; } } // self draw this->draw(); //获取到所有子节点,调用该子节点的onvisit方法 for( ; i < arrayData->num; i++ ) { pNode = (CCNode*) arrayData->arr[i]; if (pNode) { pNode->visit(); } } } else {//调用自己的画方法,实现图像绘制 this->draw(); } // reset for next frame m_uOrderOfArrival = 0; if (m_pGrID && m_pGrID->isActive()) { m_pGrID->afterDraw(this); } kmGLPopMatrix();}
onvisit 与ondraw方法都是虚函数,子类可以通过需要对其重载重写。
这样我们看到的图像,就通过设置帧率的时间间隔,调用opengl不停的绘制,就显现出来了;
总结以上是内存溢出为你收集整理的cocos2dx渲染流程全部内容,希望文章能够帮你解决cocos2dx渲染流程所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)