对应源码位置:(1)cocos2d-x-3.3\cocos\platform\win32\CCApplication-win32.* (2)cocos2d-x-3.3\cocos\base\CCDirector.*
以Win32平台为例,找到 main 函数
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()
这里就看到了 关键的主循环 director->mainLoop();
while(!glview->windowShouldClose())
{
QueryPerformanceCounter(&nNow);
if (nNow.QuadPart - nLast.QuadPart > _animationInterval.QuadPart)
{
nLast.QuadPart = nNow.QuadPart - (nNow.QuadPart % _animationInterval.QuadPart);
director->mainLoop();
glview->pollEvents();
}
else
{
Sleep(1);
}
}
再到 mainLoop
可以看到每一帧 ,主要做了绘制场景,和最后的内存管理,内存管理后面再细说,先看看 drawScene();
void DisplayLinkDirector::mainLoop()
{
if (_purgeDirectorInNextLoop)
{
_purgeDirectorInNextLoop = false;
purgeDirector();
}
else if (! _invalid)
{
drawScene();
// release the objects
PoolManager::getInstance()->getCurrentPool()->clear();
}
}
关键的 drawScene
为了清晰,删除了一些不重要的代码,可以看出来,这里每帧先计算 delta time 然后据此,更新所有游戏对象(_scheduler),进行事件分发(_eventDispatcher),最后进行图形绘制,下一篇从 scheduler 说起。
// Draw the Scene
void Director::drawScene()
{
// 计算 delta time
calculateDeltaTime();
if (! _paused)
{
//调度更新
_scheduler->update(_deltaTime);
//事件分发
_eventDispatcher->dispatchEvent(_eventAfterUpdate);
}
if (_runningScene)
{
//把绘制命令排序,并未真正的绘制
_runningScene->render(_renderer);
_eventDispatcher->dispatchEvent(_eventAfterVisit);
}
//真正的渲染
_renderer->render();
_eventDispatcher->dispatchEvent(_eventAfterDraw);
// 交换缓冲区 基本操作
if (_openGLView)
{
_openGLView->swapBuffers();
}
if (_displayStats)
{
// 计算一些调试信息
calculateMPF();
}
}
本文以Win32平台为例,详细分析了cocos2d-x 3.3版本中主循环的流程。从main函数开始,经过Application::run(),深入到mainLoop,重点探讨了drawScene()的实现。drawScene每帧计算delta time,更新游戏对象,分发事件,并执行图形绘制。后续将对scheduler进行进一步讨论。

3210

被折叠的 条评论
为什么被折叠?



