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

猜测它有可能是在主循环里使用了 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) {
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 好了,流畅,无问题,感觉上也方便计算...

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

时间: 2024-10-20 16:42:09

COCOS2DX WIN32 版本的CPU占用25%改良策略的相关文章

改良cocos2dx Win32下的内存占用

猜测它有可能是在主循环里使用了 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) 上面. 并且,我还

Web API的CPU占用100%

我用Web API做了一个网站,网站很简单,请求就是几个普通的参数,提交到服务器后,在Web API里做一下参数验证,然后去访问Redis里的TIME命令,最后把TIME命令返回的结果计算出yyyy-MM-dd HH:mm:ss的形式,返回JSON格式.每秒请求数:1500次.CPU占用100%内存和IO都比较低. CPU:E5800 内存:4G+2G 硬盘:普通蓝盘500G各位,有人遇到过这样的情况吗? ---------------------------------------------

多线程程序 怎样查看每个线程的cpu占用

可以用下面的命令将 cpu 占用率高的线程找出来: ps H -eo user,pid,ppid,tid,time,%cpu,cmd --sort=%cpu 这个命令首先指定参数'H',显示线程相关的信息,格式输出中包含:user,pid,ppid,tid,time,%cpu,cmd,然后再用%cpu字段进行排序.这样就可以找到占用处理器的线程了. 直接使用 ps Hh -eo pid,tid,pcpu | sort -nk3 |tail 获取对于的进程号和线程号,然后跳转到3.查看哪个进程线程

“RESOURCE MONITOR“CPU占用特别高

背景: SQL Server 2008 R2 10.50.1600 没有设置页面文件,内存为64G,数据库分配50G cpu使用占了50%以上,平时只有10-20%,某台服务器“RESOURCE MONITOR“CPU占用特别高. 原因: 网上有说是虚拟内存不够,也有说升级版本就可以解决. 猜测,是因此资源不足,导致RESOURCE MONITOR一直在运行,从而导致cpu太高 解决方法: 设置更大到内存

SQLSERVER排查CPU占用高的情况

SQLSERVER排查CPU占用高的情况 今天中午,有朋友叫我帮他看一下数据库,操作系统是Windows2008R2 ,数据库是SQL2008R2 64位 64G内存,16核CPU 硬件配置还是比较高的,他说服务器运行的是金蝶K3软件,数据库实例里有多个数据库 他说是这几天才出现的,而且在每天的某一个时间段才会出现CPU占用高的情况 内存占用也很高,占用了30个G -----------------------------------------------华丽的分割线-------------

WinDbg调试CPU占用高的问题 试验+实战 《第七篇》

一.High CPU试验 1.示例代码 static void Main(string[] args) { Console.Clear(); Console.WriteLine("到命令行下,切换到windbg目录,执行adplus -hang -pn highcpu.exe -o c:\\dumps"); Console.WriteLine("如果要停止,按Ctrl+C结束程序"); Console.WriteLine("================

完美编译暗黑世界1.4的win32版本(支持线程和联网模块)

完美编译暗黑世界1.4的win32版本(支持线程和联网模块) (原文地址/下载地址:http://www.9miao.com/question-15-53447.html) 首先,非常感谢9秒团队无私奉献的精神,把暗黑世界客户端源代码免费公开! 让我们有了学习cocos2Dx的入门工程,造福广大会员,功德无量! 本次修改,我是在1.3基础上的,其实也是在1.0基础上一步一步修改过来的. 初学者可以先看1.0的工程,再看1.3的工程,接着就是看1.4的工程了. 一些文件配置和拷贝,请参考1.0和1

sql数据库cpu占用100问题查询

转载    原作者  xunziji SQL Server Cpu 100% 的情况并不太常见,一般引起 SQL Server 产生性能问题的,都是 阻塞.连接数.IO 磁盘等.所以,一般SQL Server 的使用率都是比较低的.但是,在有些情况下,还是会出现Cpu 100%的情况的. SQL Server 在做哪些操作的时候,会比较集中使用 CPU 资源呢?常见的主要如下: 常见的原因: 1. 编译和重编译 编译是 SQL Server 为指令生成执行计划的过程.SQL Server 要分析

解决YED画图CPU占用100%的问题

背景 公司很多项目都会用到YED包来画关联方的关联图,当某个公司的4度关联方个数过多以及关联关系太过复杂时,使用YED画图会造成CPU占用一直100%并且长时间占用不释放CPU资源.所以在使用YED画图的代码流程设计需要一些技巧来保证YED画图不会阻塞主线程,并且确保当图片长时间无法绘制成功时,需要有一种机制强制终止绘制,避免CPU资源长时间无意义的浪费. 解决方案思考 找出YED无法完成绘制的原因.从根本上解决. 如果无法从根本上解决至少需要解决长时间CPU100%占用. 尝试解决 首先尝试了