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

转载 2013年12月03日 12:41:06

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

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

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

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

也就是说,该循环除了执行 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) { 
nLast.QuadPart = nNow.QuadPart; 

因为每次在 nLast 中记录 nNow 时间,并用时间差与设定间隔作比较,时间差往往会比设定间隔要大,如果是在不精确的 Sleep(1) 以及每循环负担比较大的情况下,将导致每帧实际所花的时间,会超出设定间隔不少,从而拖慢游戏速度(如果游戏按帧步进计时的话)。

为解决这个问题,我用的是时间对齐的方式。其实就是改了一下更新 nLast 的表达式:

nLast.QuadPart = nNow.QuadPart - (nNow.QuadPart % m_nAnimationInterval.QuadPart);

这样每帧的总消耗时间就相当的恒定了。

上面的问题解决并不算太完美。如何保持 60 fps 也能 cpu 0% 占用呢? 我考虑的方案是修改 Sleep(1) 的精度。

找了一下资料,发现 Winmm.lib 库中有   timeBeginPeriod(1);    timeEndPeriod(1);    函数可以用于该目的,令 Sleep(1) 的精度提升到1毫秒级别,遂动手改之:

1. 添加 Winmm.lib 库的引用。我在这里采取了在 CCApplication.cpp 头部添加  #pragma   comment(lib, "Winmm.lib")  语句的方式。

2. 在 while(1) 代码段的前后,分别放上 timeBeginPeriod(1);    timeEndPeriod(1);  语句

这样就算完工了。

经测试,帧速设定在 59 fps 以内, cpu 都可以实现 0 占用 (i7 2600k)。设成 60 的话, cpu 占用会周期性的古怪浮动,暂时不明就里中。而设成 60+, cpu 将 100%。

不过该问题就算暂时告一段落,先将程序限定到 50 fps 好了,流畅,无问题,感觉上也方便计算...

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

2013-06-16 16:42 36人阅读 评论(0) 收藏 举报         关于 cocos2d-x win32 版本的 cpu 占用改良              初学 c2d...
  • maikforever
  • maikforever
  • 2013年06月18日 23:26
  • 563

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

关于 cocos2d-x win32 版本的 cpu 占用改良              初学 c2dx,下载的 2.02 版本, 发现其 HelloWorld 演示项目,居然一直占据了 100%...
  • cfanzp
  • cfanzp
  • 2013年06月16日 16:42
  • 525

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

转自:http://blog.csdn.net/crystal_ooo/article/details/8081873 初学 c2dx,下载的 2.02 版本, 发现其 HelloWorld 演...
  • kenkao
  • kenkao
  • 2013年08月31日 09:52
  • 1326

COCOS2DX WIN32 版本的CPU占用25%改良策略

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

COCOS2DX WIN32 版本的CPU占用25%改良策略

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

COCOS2DX WIN32 版本的CPU占用25%改良策略

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

SQL Server中查询CPU占用高的SQL语句

SQL Server中查询CPU占用高的情况,会用到sys.sysprocesses ,dm_exec_sessions ,dm_exec_requests   一、查看当前的数据库用户连...
  • isoleo
  • isoleo
  • 2015年03月02日 18:09
  • 5777

windows下查找java应用占用CPU过高问题

最近在测试一个用java语言实现的数据采集接口时发现,接口一旦运行起来,CPU利用率瞬间飙升到85%-95%,一旦停止就恢复到40%以下,这让我不得不面对以前从未关注过的程序性能问题。 在硬着头皮查找...
  • ningzuobei
  • ningzuobei
  • 2015年09月30日 15:10
  • 8772

win7启动后trustedinstaller.exe占用cpu过高问题

win7启动后trustedinstaller.exe占用cpu过高问题 笔者笔记本电脑操作系统Win7 SP1, 下午系统启动后发现排风位置动作很大,打开任务管理器,发现cpu使用近 100%。...
  • java_student09
  • java_student09
  • 2015年05月13日 20:36
  • 2235

一次CPU占用过高事件的胡乱解决

1.起因之前组里做了一个基于drools的业务逻辑校验程序,使用的是java语言。因为工作后一直就用C#,但是学校里教的都是java,用上了很久没用的java还是挺高兴的。做完,测试完,放到线上,回家...
  • smtctc
  • smtctc
  • 2017年06月28日 20:56
  • 945
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:关于 cocos2d-x win32 版本的 cpu 占用改良
举报原因:
原因补充:

(最多只允许输入30个字)