首页 > 其他分享 >COCOS2DX WIN32 版本的CPU占用25%改良策略

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

时间:2022-12-27 11:34:08浏览次数:52  
标签:60 COCOS2DX lib 25% WIN32 Sleep QuadPart nNow nLast


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 ?? 则该方案大为可行。

 

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);​​


  

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

 

cpu 0% 占用呢? 我考虑的方案是修改 Sleep(1) 的精度。

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

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

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

这样就算完工了。

 

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

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

标签:60,COCOS2DX,lib,25%,WIN32,Sleep,QuadPart,nNow,nLast
From: https://blog.51cto.com/u_15923385/5971861

相关文章

  • COCOS2DX 3.0 优化提升渲染速度 Auto-batching
    COCOS2DX3.0优化提升渲染速度Auto-batchingAutoCulling动态缩减功能下面就来仔细看看吧:整合好的渲染提速干货:简介在游戏的绘制渲染中,往往消耗很多资源和内存,当绘制......
  • leetcode笔记——325周赛
    2515.到目标字符串的最短距离-力扣(LeetCode)这道题一次遍历就可以做,直接用abs(i-startindex)和n-abs(i-startindex)即可表示距离,但我做的时候绕麻烦了......
  • kubeadm安装k8s 1.25单master集群
    百度网盘链接:https://pan.baidu.com/s/15t_TSH5RRpCFXV-93JHpNw?pwd=8od31kubeadm安装k8s1.25单master集群1.1初始化安装k8s集群的实验环境K8S集群角色IP......
  • win32编程 -- 消息机制(二)
    我知道你最近很累,是那种看不见的身体上精神上的以及对未来的那种无力感,但请一定要坚持下去。。。---- 网易云热评 一、消息的获取1、GetMessage:从系统获取消息,将消息从系......
  • win32编程 -- 窗口注册与创建
    你学不进的东西有人学,你不经历的有人经历,你吃不了的苦有人吃,想让人望而生畏,就要拿出常人百倍的野心去奋斗。。。---- 网易云热评 一、窗口类窗口类包含了窗口的各种参数......
  • win32编程 -- 通过空项目学习自动生成的代码框架
    将喜欢的东西留在身边,这就是努力的意义。。。---- 网易云热评一、新建空项目 二、右击项目查看属性,修改项目字符集的属性为多字节 三、右击项目,添加c++文件 四、添加代......
  • win32编程 -- 消息机制(一)
    你多少岁不重要,看起来像几岁才重要,不要把辛苦和怨气都挂在脸上,你想要最好的生活,就先让生活看到最好的你。。。。---- 网易云热评 一、程序执行机制1、过程驱动-程序的......
  • win32编程 -- 字符串资源与快捷键资源
    就趁着春天吧,一点一点重新来过。。。---- 网易云热评一、字符串资源1、新建String Table2、修改相应的字符串,主要用来切换中英文3、替换文中的字符串wchar_ts[256]={......
  • win32编程 -- 进程
    年轻的时候爱上什么都不为过,成熟了以后放弃什么都理解,我们终其一生,不过是想找一个能一起吃饭的人。。。---- 网易云热评一、Windows进程介绍一个容器,包含程序执行需要的代......
  • win32编程 -- 菜单资源
    相亲的男生普遍自卑,而女生却比较挑剔,因为大部分男生已经意识到自己的普遍,而女生往往却还活在梦里。。。---- 网易云热评一、资源介绍accelerator:快捷键bitmap:位图cursor:光......