转自: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) {
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 占用改良相关推荐

  1. 网页无插件直播视频平台EasyNVR老版本更新版本后CPU占用过高怎么解决?

    TSINGSEE青犀视频经过几年的发展,积累了不少项目客户.一个月前,有个老客户旧版本的EasyNVR升级至新版本,升级后使用过程中会不时出现CPU占用过高的现象. 经过研发在本地测试,并没有出现CP ...

  2. 记win10 ltsc版本wsappx进程CPU占用过高解决过程

    给旧电脑换固态硬盘装了个win10 ltsc版本,想看看内存占用,结果却发现CPU一直有30%多的占用,主要是wsappx这个进程. 查了一下是微软应用商店的进程,然后发现这个版本的win10根本没有 ...

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

    可以用下面的命令将 cpu 占用率高的线程找出来:  ps H -eo user,pid,ppid,tid,time,%cpu,cmd --sort=%cpu 这个命令首先指定参数'H',显示线程相关 ...

  4. SQLSERVER排查CPU占用高的情况

    今天中午,有朋友叫我帮他看一下数据库,操作系统是Windows2008R2 ,数据库是SQL2008R2 64位 64G内存,16核CPU 硬件配置还是比较高的,他说服务器运行的是金蝶K3软件,数据库 ...

  5. Visual Studio 2013运行时卡顿 CPU占用超高的解决方法

    文章原始连接: http://feotech.com/?p=116 Visual Studio 2013运行时卡顿 CPU占用超高的解决方法 使用Visual C++ 编写程序时发现输入代码时特别卡顿 ...

  6. 独占电脑装linux,旧电脑如何处理?装Tiny Core,极致精简,超低CPU占用,你敢试吗...

    原标题:旧电脑如何处理?装Tiny Core,极致精简,超低CPU占用,你敢试吗 说到旧电脑,想必很多人家里都会有一台电脑,它很旧,很老,连win7都用不了-- 那么,这台旧电脑应该如何处理呢?怕是只 ...

  7. editorloop 占用_systemd CPU占用100%,并出现大量僵尸进程

    有一天,突然大量CentOS 7服务器出现异常,表现为systemd CPU占用100%,并出现大量僵尸进程,top信息如下:top信息 随着僵尸进程的增加,系统资源渐渐被消耗完,导致宕机. 在Cen ...

  8. 电脑cpu温度过高怎么办_网络资讯:电脑cpu占用过高处理办法

    今天来说一下电脑cpu占用过高处理办法这方面的一些讯息,不少朋友对电脑cpu占用过高处理办法这方面的一些讯息颇感兴趣的,小编今天就整理了一些信息,希望对有需要的朋友有所帮助. 1.安装并使用杀毒软件全 ...

  9. 分页缓冲池占用很高怎么解决_一次线上服务高 CPU 占用优化实践

    线上有一个非常繁忙的服务的 JVM 进程 CPU 经常跑到 100% 以上,下面写了一下排查的过程.通过阅读这篇文章你会了解到下面这些知识. Java 程序 CPU 占用高的排查思路 可能造成线上服务 ...

最新文章

  1. 一个当了爹的程序员的自白
  2. Linux纯干货知识总结|面试专用
  3. Cheatsheet: 2011 12.01 ~ 12.12
  4. 一段代码把网站变成灰白色
  5. Python 安装modules问题及import问题
  6. C#在Web项目中关闭Excel进程的方法
  7. The labor day's schedule and the rate of process
  8. 手把手教你配置国内镜像源
  9. idea 2017 破解方法
  10. Win11怎么不让软件联网?Win11禁止某个软件联网的方法
  11. IDEA突然不能输入中文
  12. 心知天气api PHP,php调用心知天气API,实现微信自动回复
  13. 07:计算多项式的值
  14. 手机上好用的apm测试软件,在哪才能找到测apm的软件  及如合使用  – 手机爱问...
  15. Java 时间间隔计算工具类
  16. java基础知识面试题(2020年最新版)
  17. Spring监听器的完整使用步骤
  18. CHM文件无法打开的解决方法
  19. 成绩查询系统--发布篇--centOS7 tomcat开机启动 + mysql数据库配置
  20. 既约分数(python)

热门文章

  1. 洛谷——P2524 Uim的情人节礼物·其之弐
  2. 解决实例化Servlet类[com.mu.servlet.HelloServlet]异常
  3. 关于使用MYSQL出现的内存泄漏问题
  4. 数据库学习--主从复制
  5. 深入理解JAVA锁的机制
  6. ansible安装与配置文件
  7. XML DOM学习笔记(JS)
  8. java线程池需要shutdown吗_公用线程池要不要shutdown?
  9. loss值多少才算收敛_库存究竟多少才算合理?
  10. 如何使用Selenium-Grid