现在的位置: 首页 > 综合 > 正文

关于 cocos2d-x win32 版本的 cpu 占用改良

2013年01月22日 ⁄ 综合 ⁄ 共 860字 ⁄ 字号 评论关闭

转自:http://blog.csdn.net/crystal_ooo/article/details/8081873

初学 c2dx,下载的 2.02 版本, 发现其 HelloWorld 演示项目,居然一直占据了
100% 的 CPU。

猜测它有可能是在主循环里使用了 Sleep(0), 一搜,果然定位到具体代码,它位于 cocos2dx\platform\win32\CCApplication.cpp,大致长像如下:

1 while(
1 ) {
2 if(
有消息 ) {
3 if(
时间到 ) 更新计时, call 主循环函数;
4 else Sleep(0);
5 }
6 //
其他跳出循环判断代码
7 }

 

也就是说,该循环除了执行 mainLoop 以外,花了大量时间在 检查消息和 Sleep(0) 上面。

 

并且,我还发现一个奇怪的现象(暂时还不清楚是为什么),即:

HelloCPP 项目的 AppDelegate.cpp 文件中有一行代码:

 

//
set FPS. the default value is 1.0/60 if you don't call this
pDirector->setAnimationInterval(1.0
/ 60);

  

 

上面的 60 ,如果改大,不起任何作用,帧速始终是 60 不会变。但如果改到小于60,是可以起作用的。

 

于是,解决 CPU 占用的思路,始于 “是否可以降低循环精度” 的念头。

已知正常情况下,执行 Sleep(1) ,会睡大概 1/50 秒,这个时间并不精确也不准确,看上去无法满足 60 fps 这个流畅度需求。不过,如果游戏运行帧速不需要这么高,比如 30 fps ?? 则该方案大为可行。

 

经实际测试,将 Sleep(0) 改成 Sleep(1), 再将上面代码中的 60 改成 25, 效果非常显著。但另一个问题来了:如果每游戏循环做的事有点多,时间有点长,那么游戏将被拖慢。

 

原engine中,同步时间的代码如下:

 

QueryPerformanceCounter(&nNow);
if (nNow.QuadPart
- nLast.QuadPart > m_nAnimationInterval.QuadPart) {

抱歉!评论已关闭.