转自:http://blog.csdn.net/crystal_ooo/article/details/8081873
初学 c2dx,下载的 2.02 版本, 发现其 HelloWorld 演示项目,居然一直占据了
100% 的 CPU。
猜测它有可能是在主循环里使用了 Sleep(0), 一搜,果然定位到具体代码,它位于 cocos2dx\platform\win32\CCApplication.cpp,大致长像如下:
1 |
while ( |
2 |
if ( |
3 |
if ( |
4 |
else Sleep(0); |
5 |
} |
6 |
// |
7 |
} |
也就是说,该循环除了执行 mainLoop 以外,花了大量时间在 检查消息和 Sleep(0) 上面。
并且,我还发现一个奇怪的现象(暂时还不清楚是为什么),即:
HelloCPP 项目的 AppDelegate.cpp 文件中有一行代码:
// |
pDirector->setAnimationInterval(1.0 |
上面的 60 ,如果改大,不起任何作用,帧速始终是 60 不会变。但如果改到小于60,是可以起作用的。
于是,解决 CPU 占用的思路,始于 “是否可以降低循环精度” 的念头。
已知正常情况下,执行 Sleep(1) ,会睡大概 1/50 秒,这个时间并不精确也不准确,看上去无法满足 60 fps 这个流畅度需求。不过,如果游戏运行帧速不需要这么高,比如 30 fps ?? 则该方案大为可行。
经实际测试,将 Sleep(0) 改成 Sleep(1), 再将上面代码中的 60 改成 25, 效果非常显著。但另一个问题来了:如果每游戏循环做的事有点多,时间有点长,那么游戏将被拖慢。
原engine中,同步时间的代码如下:
QueryPerformanceCounter(&nNow); |
if (nNow.QuadPart |