C++游戏界面不流畅的问题
来源:互联网 发布:弹簧机系统编程 编辑:程序博客网 时间:2024/04/25 20:42
也许是我游戏玩多了,我突然发现,我的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秒...唉,人类真聪明,真可怕,说到聪明可怕...
然而,并没有什么卵用,不能再说了,扯太远了,到此为止~!
1 0
- C++游戏界面不流畅的问题
- 图片圆角造成界面不流畅问题
- Viewpager滑动不流畅问题
- DirectShow改变参考时间解决视频不流畅的问题
- 解决系统窗口拖动不流畅的问题
- openstack远程桌面连接后,显示不流畅的问题
- Viewpager结合RadioGroup切换的卡顿,不流畅问题
- 隐藏显示导航栏切换不流畅的问题
- NestedScrollView嵌套RecyclerView时滑动不流畅问题的解决办法
- NestedScrollView嵌套RecyclerView时滑动不流畅问题的解决办法
- 解决ScrollView嵌套RecyclerView导致滑动不流畅的问题
- NestedScrollView嵌套RecyclerView时滑动不流畅问题的解决办法
- NestedScrollView嵌套RecyclerView时滑动不流畅问题的解决办法
- 解决ScrollView嵌套RecyclerView导致滑动不流畅的问题
- H5页面在 ios 端滑动不流畅的问题
- 解决ScrollView嵌套RecyclerView导致滑动不流畅的问题
- 解决ScrollView嵌套RecyclerView导致滑动不流畅的问题
- NestedScrollView嵌套RecyclerView时滑动不流畅问题的解决办法
- Druid数据库连接池使用
- Hermes:来自腾讯的实时检索分析平台
- NSInteger 和 int 区别
- 女神保卫战本期擂主奶茶MM
- 【CTF-WEB】WEB小伎俩 _CTF自学纪实
- C++游戏界面不流畅的问题
- Protobuf协议格式详解
- Android中Activity启动模式详解
- Grand Central Dispatch (GCD) 用法详细介绍
- nginx: [emerg] unexpected “}”
- velocity 显示List和Map方法
- 一些常用的Bootstrap模板资源站
- android属性动画详解一
- [Guzzle] PHP HTTP 客户端和框架