cocos2dx渲染流程

cocos2dx渲染流程,第1张

概述2.x版本 一个程序的开始:我们先从main函数开始看, return CCApplication::sharedApplication()->run(); 进入改函数中,改函数中代码片段 CCApplication类是跨平台文件,不同平台的实现方式不一样,ios的是*.mm文件,里面实现死循环的方式也是调用该平台的方式,不过意思都是这样只不过,实现不同。 //一个死循环 while (1)

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();}


draw方法里面调用的就是opengl方法,实现绘制。


onvisit 与ondraw方法都是虚函数,子类可以通过需要对其重载重写。

这样我们看到的图像,就通过设置帧率的时间间隔,调用opengl不停的绘制,就显现出来了;

总结

以上是内存溢出为你收集整理的cocos2dx渲染流程全部内容,希望文章能够帮你解决cocos2dx渲染流程所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1027586.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-23
下一篇 2022-05-23

发表评论

登录后才能评论

评论列表(0条)

保存