或许是我游戏玩多了,我突然发现,我的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);
//更新fps
UpdateFPS();
//画一帧
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. iOS开发之多种Cell高度自适应实现方案的UI流畅度分析

    本篇博客的主题是关于UI操作流畅度优化的一篇博客,我们以TableView中填充多个根据内容自适应高度的Cell来作为本篇博客的使用场景.当然Cell高度的自适应网上的解决方案是铺天盖地呢,今天我们的 ...

  2. 第三方Android 模拟器流畅速度快,适合开发人员

    “工欲善其事,必先利其器.” 使用Android模拟器开发和调试应用肯定比使用真机方便.但相比XCODE的IOS模拟器,Android SDK自带的AVD实在不争气,不过一些第三方的模拟器却表现不俗! ...

  3. 腾讯GT的流畅度测试方案研究

    GT源码:https://github.com/TencentOpen/GT 一.流畅度模块的代码结构 流畅度插件总共就几个类,其实处理方式也比较简单粗暴,就是通过Choreographer输出的lo ...

  4. CSS3 速移动效果动画流畅无卡顿

    js或jquery 元素移动以像素计算,手机上移动效果会有卡顿 利用CSS3 可以很简单的实现流畅的移动动画 transform: translate3d(66px, 88px, 0px) rotat ...

  5. 如何编写稳定流畅的iOS移动端应用

    原文链接:http://www.jianshu.com/p/f4adce56166f 不忘初心 在过去几年间,移动应用以雷霆之势席卷全球.我们在工作和休闲时间中使用互联网的方式,已经随着移动应用的前进 ...

  6. iOS 保持界面流畅的技巧 (转载)

    这篇文章会非常详细的分析 iOS 界面构建中的各种性能问题以及对应的解决思路,同时给出一个开源的微博列表实现,通过实际的代码展示如何构建流畅的交互. Index 演示项目 屏幕显示图像的原理 卡顿产生 ...

  7. vue-lazy-render: 延迟渲染大组件,增强页面切换流畅度

    最近用element来做项目,在开发的过程中,突然发现页面的操作和切换在数据量大的时候相当卡,后来提了个issue,在furybean解答后才知道,我每个单元格都加了tooltip,会生成大量的节点, ...

  8. Andy - 又一款速度流畅的免费安卓 Android 模拟器 (支持手机无线控制电脑模拟器)

    随着 Genymotion.BlueStacks 等电脑上的 Android 模拟器流行起来之后,似乎很多人都发现在电脑上运行使用安卓APP软件.畅玩手机游戏确实很有乐趣. 今天我们又发现了一款全新免 ...

  9. IOS的H5页面滑动不流畅的问题:

    IOS的H5页面滑动不流畅的问题: -webkit-overflow-scrolling : touch; 需要滑动的是哪块区域,就在哪里加上这段代码就OK

随机推荐

  1. NYOJ 127 星际之门(一) (数学)

    题目链接 描述 公元3000年,子虚帝国统领着N个星系,原先它们是靠近光束飞船来进行旅行的,近来,X博士发明了星际之门,它利用虫洞技术,一条虫洞可以连通任意的两个星系,使人们不必再待待便可立刻到达目的 ...

  2. BeeFramework 系列一 安装篇(Arc)

    http://ilikeido.iteye.com/blog/1881390 Beeframework 是一款iOS快速开发框架,它以UISignal强大的路由功能替代原有Delegate方式,完成复 ...

  3. PL/SQL 04 游标 cursor

    --游标 declare  cursor 游标名字  is  查询语句;begin  其他语句;end; --游标的属性%FOUND%NOTFOUND%ISOPEN%ROWCOUNT(当前游标的指针位 ...

  4. 各种排序算法的总结、比较与Java实现

    1 快速排序(QuickSort) 快速排序是一个就地排序,分而治之,大规模递归的算法.从本质上来说,它是归并排序的就地版本.快速排序可以由下面四步组成. (1) 如果不多于1个数据,直接返回.(2) ...

  5. hdu 1669(二分图多重匹配)

    Jamie's Contact Groups Time Limit: 15000/7000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/ ...

  6. java类型强转

    知乎: 首先基本数据类型不是对象,强转改的是值,分为有损和无损,有损会丢失数据细节. 然后对象,只有继承关系的类才能强转,改变的只是引用,而且向上转型是安全的,把你转为人类是安全的,你还是你,只是现在 ...

  7. MySQL数据库中的Date,DateTime,int,TimeStamp和Time类型的对比

    DATETIME 用在你需要同时包含日期和时间信息的值时.MySQL检索并且以'YYYY-MM-DD HH:MM:SS'格式显示DATETIME值,支持的范围是'1000-01-01 00:00:00 ...

  8. [libgdx游戏开发教程]使用Libgdx进行游戏开发(4)-素材管理

    游戏中总是有大量的图像资源,我们通常的做法是把要用的图片做成图片集,这样做的好处就不多说了.直接来看怎么用. 这里我们使用自己的类Assets来管理它们,让这个工具类作为我们的资源管家,从而可以在任何 ...

  9. 使用Bot Service创建Bot Framework

    创建Bot Service:进入至Azure控制台中,新建Bot Service,如不知道Bot Service在哪个选项中,可以先查找Bot Service再创建 在弹出的查询结果中,选择Bot S ...

  10. 使用threadpool并发测试,报错HTTPConnectionPool Max retires exceeded

    解决方法:和以下答案一致 https://blog.csdn.net/qq_21405949/article/details/79363084 场景: 在做爬虫项目或者是在发送网络请求的时候,一般都会 ...