引擎的主要入口是AppDelegate中,run方法有一个while循环
while(!glview->windowShouldClose())
{
QueryPerformanceCounter(&nNow);
//前后两次的时间间隔超过我们设置的帧频
if (nNow.QuadPart - nLast.QuadPart > _animationInterval.QuadPart)
{
nLast.QuadPart = nNow.QuadPart;
director->mainLoop();
glview->pollEvents();
}
else
{
//让出CPU资源给让其他线程抢夺机会
Sleep(0);
}
}
只要OpenGL视图没有关闭,程序就始终处于这个循环中,首先计算两次循环的时间间隔是不是超过我们所设置的帧频,如果超过了我们就进行一次绘制,否则让出CPU内存给其他线程。这里说明一下抢占式操作系统,进程一旦拿到CPU,除非它自己主动释放,否则它将一直对CPU保持占有权,在它主动释放CPU后,系统为所有进程进行一个优先级计算,优先级最高的进程将拿到属于它的CPU。所以我们这里让线程sleep的原因就是让出CPU,防止界面出现假死现象。
再来看导演类的mainloop函数,
if (_purgeDirectorInNextLoop)
{<