昨日不可追, 今日尤可为.勤奋,炽诚,不忘初心


也许是我游戏玩多了,我突然发现,我的C++程序画面画面一顿一顿的,不流畅.肯定哪里不对,要改.

奇怪啊,为什么我以前,在我电脑上就不这么卡,就看不出画面一顿一顿的呢?

百度了,狗狗了,必应了,然而,并没有什么卵用.

扭头问老大,老大一声令下:不许问别人,这个问题单独解决,顺便提交个解决方案我.

的确,人需要有解决问题的能力,这一点很重要.其实,最重要的是记性,<<最强大脑>>没记性再好的分析能力都没用.

真羡慕你们的好记性...

羡慕虽好,然而,并没有什么卵用.还得靠自己多锻炼.

好了,开始分析问题:

问题:我程序里,用w,s,a,d按键控制摄像机的前进,后退,左移,右移.可是,比如,我一直按着w,前进,前进的公式为:

w = 10像素/秒 * 时间长度.

现象:一段时间不动,然后突然跳到前面,就像我按着前进按键,它不动,然后过会儿突然闪现到前面...一直这样,画面一愣一愣的...

猜想:是不是我最近改了什么代码所致?对,我最近是添加了着色器程序,那我运行没有着色器的程序试试看

结果:一样,一愣一愣的,而且别的项目也一样.

结论:跟新修改的代码有关系可能性不大.

继续猜想:可能 win32程序中消息循环那儿 timedelta有问题

代码如下所示:

void Application::Run()
{MSG msg;static float lastTime = (float)timeGetTime();//上一次的时间ZeroMemory(&msg, sizeof(MSG));while (msg.message != WM_QUIT){if (PeekMessage(&msg, 0, 0, 0, PM_REMOVE)){TranslateMessage(&msg);DispatchMessage(&msg);}else{float currTime = (float)timeGetTime();//当前的时间float timedelta = (currTime - lastTime)*0.001f;   //时间间隔//世界更新m_GameWorld->Update((float)timedelta);//更新fpsUpdateFPS();//画一帧DrawOneFrame();lastTime = currTime;}}
}

下断点观察 timedelta 变量是不切实际的,因为消息循环速度非常非常快,只有几毫秒甚至只有几微秒!!!

那怎么观察timedelta变量的变化呢?老大说用控制台来输出这个变量.没搞错吧...win32  MFC窗口怎么用控制台,特么逗我么.

没文化真可怕.

一搜,果然有win32上附加生成一个控制台的方法,

步骤:1.加头文件:#include <conio.h>

2.程序的开头加函数:AllocConsole();

3.在要输出变量的地方加:_cprintf("timedelta = %f\n", timedelta);

4.程序的最后释放分配的控制台:FreeConsole();

ok,配置完毕,赶紧看下输出数据吧:

结果:

一大堆的0.000000,然后突然0.128000

结论:罪魁祸首原来在这里,这就是导致不孕不...不是,呸,导致画面不平滑,一愣一愣的根本原因.

其他时候都是0,突然0.128大动一下,问题的根本原因已经找到.这就是导致显示不连续的原因.

疑惑:消息循环run函数为什么数据会不连续?更新,渲染,一圈下来时间居然为0?怎么可能...

猜想:我用的数据类型是float,精度难道不够用吗?粗略估计下,画面fps在2000左右.也就是0.5毫秒一帧,

也就是0.0005秒应该没超过float的精度范围啊...

出于好奇,还是换了双精度的double试了一下,

然而,并没有什么卵用.

说明不是精度的缘故.

继续猜想:也许跟timeGetTime这个获取时间的函数有关系,吾查询了网上大量的文献资料,发现它获取的时间精度也不高

误差几十,甚至几百毫秒,我就说嘛,远远达不到这台电脑的fps需求嘛(公司电脑配置太好,fps能上万,也就是误差要在0.1毫秒之内)

我明白了...这也是为什么在我自己垃圾电脑上发觉不出来一愣一愣的原因了,因为我电脑配置太低,效果不明显...

附公司电脑配置图:

(装B,莫打我...)

所以寻找高精度的计时函数QueryPerformanceFrequency()和QueryPerformanceCounter()

这两函数牛逼啊,根硬件时钟的晶振是一个级别的,资料上说,精确到了千分之一毫秒,也就是微秒级别的...

好啊,要的就是你啊....

以下便是修改的消息循环run的代码:

void Application::Run()
{MSG msg;LARGE_INTEGER nFreq;LARGE_INTEGER nBeginTime, nEndTime;QueryPerformanceFrequency(&nFreq);//获得时钟频率QueryPerformanceCounter(&nBeginTime);//开始的时间ZeroMemory(&msg, sizeof(MSG));while (msg.message != WM_QUIT){if (PeekMessage(&msg, 0, 0, 0, PM_REMOVE)){TranslateMessage(&msg);DispatchMessage(&msg);}else{QueryPerformanceCounter(&nEndTime);//结束的时间         float timedelta = (float)(nEndTime.QuadPart - nBeginTime.QuadPart) / (float)nFreq.QuadPart;_cprintf("timedelta = %f\n", timedelta);//控制台输出结果//世界更新m_GameWorld->Update((float)timedelta);    //d3d设备指针一个项目里只能有唯一一个UpdateFPS();//画一帧DrawOneFrame();nBeginTime = nEndTime;}       }
}

结果:

唉,整个人心情都好了,摄像机移动,画面流畅得一笔啊...

另外,说到时间,我就想到了晶振,说到晶振,我就想到了15万元一只的万国牌手表,心想,贵有什么用,准么?

说到准,我想起了世界上最准的钟---原子钟:有铯原子钟,氢原子钟,铷原子钟,CPT原子钟,

呀的,这玩意50亿年误差不过1秒...唉,人类真聪明,真可怕,说到聪明可怕...

然而,并没有什么卵用,不能再说了,扯太远了,到此为止~!



C++游戏界面不流畅的问题相关推荐

  1. C语言实现飞机大战小游戏

    先看一下效果: 初始游戏界面具有多个选项: 且具有多个可变设置项,方便个性化调整: 多个模式进行选择: 正式游戏界面,操作流畅,界面简单,且有操作提示: 使用函数封装代码和逻辑控制衔接每个界面,实现连 ...

  2. 播放游戏背景音乐 步骤

    播放游戏背景音乐 步骤 1.书写音乐播放的service public class MusicService extends Service {private static final int MUS ...

  3. 纯java语言做rpg游戏_【纯JAVA语言做个RPG游戏】2.游戏界面及角色移动的基本实现...

    继上次做的地图编辑器,我大致的做了一个4000X4000的游戏地图数组,不过只画了一部分,以后要加什么新东西继续编辑这个地图就行了,保存在了一个文件中. 现在便可以继续下一步,做出游戏的大致界面了. ...

  4. 目前最流畅的android手机,目前公认最流畅的4大手机系统,第一当之无愧,用三年不卡顿!...

    目前公认最流畅的4大手机系统,第一当之无愧,用三年不卡顿!我们国产的手机品牌在流畅度上已经提升了很多,且使用的寿命也是长了很多,现在一部性能好一点的手机机型也能够使用好几年的时间,不需要在短时间的更换 ...

  5. android 9 手机硬件性能,一加9系列系统评测:功能丰富+稳定流畅,或是目前最佳安卓系统...

    原标题:一加9系列系统评测:功能丰富+稳定流畅,或是目前最佳安卓系统 哪款手机是目前最火的?相信一加9系列应该是最有可能的.不得不说这款手机给我们带来的惊喜实在太多了,除了创新的高颜值外观.顶级的屏幕 ...

  6. STM32贪吃蛇(流畅,高移植性)

    目录 一.一些前言: 二.完整代码 2.2.snake.c 2.3.中断处理 2.4.startup 三.后言 一.一些前言: 自己用2.4寸TFTSPI的屏写了个贪吃蛇,蛇行走画面流畅,不会有一顿一 ...

  7. C语言贪吃蛇,流畅版,可继续升级改造

    好久没发博文了,这段时间正在入门kali,不过今天我会给大家讲解一下有关c语言贪吃蛇的小代码, 废话不多说,直接上代码 等等,不急,小编还有一个收藏了半年的文件给大家分享一下: 适合刚入门同学学习的编 ...

  8. android one手机流畅,一加9系列系统评测:功能丰富+稳定流畅,或是目前最佳安卓系统...

    哪款手机是目前最火的?相信一加9系列应该是最有可能的.不得不说这款手机给我们带来的惊喜实在太多了,除了创新的高颜值外观.顶级的屏幕.性能和影像之外,它还是全世界首款支持两年质保的手机.这还不够,一加9 ...

  9. vivov3隐藏功能_用vivo手机玩游戏,打开3个隐藏功能,流畅度媲美游戏手机!

    用vivo手机玩游戏,打开3个隐藏功能,流畅度媲美游戏手机! 自从智能机出现之后,对我们的生活改变非常大,不仅方便了我们的生活,而且还为我们带来了一些娱乐的项目,现在的年轻人就非常喜欢用手机来打游戏, ...

最新文章

  1. Mybatis复习笔记3:映射文件详解
  2. 微软CNTK 2.0版本发布,支持C#
  3. P4345-[SHOI2015]超能粒子炮·改【Lucas定理,类欧】
  4. 工作流实战_16_flowable 办理任务
  5. leetcode-189. Rotate Array
  6. 《深入理解计算机系统》CSAPP
  7. TCP模块如何处理数据包
  8. 使用jsMind实现可拖拽思维导图
  9. 《东周列国志》第二十八回 里克两弑孤主 穆公一平晋乱
  10. org.jboss.netty.util.internal.jzlib.ZStream scanned from multiple locations: jar:
  11. Shiro(三) Shiro核心原理分析
  12. htc系统Android 7.1,这款HTC太强大,被誉为刷机之王,一路升到安卓7.1
  13. 图纸设计管理平台,彩虹图纸管理软件设计管理功能
  14. python 判断矩阵是否正交
  15. 读《IBM蓝色基因百年智慧》
  16. 求解n阶方阵零化多项式的mathematica代码
  17. 客服人员如何摆脱工作上的负面情绪
  18. ssm+jsp计算机毕业设计大媛小南美味佳肴网站8p0nh(程序+LW+源码+远程部署)
  19. 滴滴java开发面试题_滴滴出行(小桔科技)亲身面试经验分享,java开发岗
  20. Android 百度地图定位工具类

热门文章

  1. 周杰伦歌词预测 #博学谷IT学习技术支持#
  2. 手机安装Python
  3. Python爬虫实践(入门篇)——抓取《天使降临到我身边》图片
  4. 利用JavaScript制作倒计时牌(转)
  5. 上海大学计算机学院2021,2020-2021学年秋季学期新生选课通知
  6. 用wt文件恢复mongodb
  7. golang 初始化并赋值_嵌套Golang对象的初始化
  8. [附源码]java毕业设计汽车票售票系统lunwen
  9. 七月算法机器学习笔记1 微积分与概率论
  10. RTThread从底层AT组件到上层SAL之间的关系