C++游戏界面不流畅的问题

或许是我游戏玩多了,我突然发现,我的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秒...唉,人类真聪明,真可怕,说到聪明可怕...

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

??

时间: 2024-08-23 12:40:23

C++游戏界面不流畅的问题的相关文章

[读书笔记]流畅的Python(Fluent Python)

<流畅的Python>这本书是图灵科技翻译出版的一本书,作者Luciano Ramalho. 作者从Python的特性角度出发,以Python的数据模型和特殊方法为主线,主要介绍了python的集合类型(sequence.mapping.set等).把函数作为一等对象来使用.类的构建.新的文件控制流程(生成器.上下文管理器.协程).用描述符来从底层解释Python对象属性的存储等各个方面. 书中主要围绕Python标准库展开,不涉及过多的异常实用的标准库以外的包. 0x01:这本书适合谁看?

使用Html5+C#+微信 开发移动端游戏详细教程:(六)游戏界面布局与性能优化

本篇教程我们主要讲解在游戏界面上的布局一般遵循哪些原则和一些性能优化的通用方法. 接着教程(五),我们通过Loading类一次性加载了全部图像素材,现在要把我们所用到的素材变成图片对象显示在界面上,由上而下,首先是top层,top里面包涵了玩家(微信)头像,关卡信息,怪物血条信息,玩家金币,玩家宝石,玩家总攻击力. 定义函数 setTop 来初始化top层: function setTop() { TopDiv = new LSprite();//定义top层 var Topshape = ne

Android流畅度之帧率

背景:app改版,人为感受卡顿,需要客观数据支撑观点.故,搜索各种性能指标,并理解之.(这是一篇摘要文......) 首先,明确人为感受的性能不好属于下面哪种: 1. 响应时间,界面跳转后响应时间: 2. 流畅度,界面操作时或动画展示的效果: 而流畅度的衡量指标又有几种: 1. 帧率fps(Frames Per Second,每秒钟填充图像的帧率) 2. 丢帧SF(Skipped frame) 3. 流畅度SM(SMoothness)(腾讯分享) 其中得到最广泛使用的还是帧率.以下详细说明之 回

UITableVIew 滚动流畅性优化

影响UITableViewUITableView滚动的流畅性原因: 1. 在代理方法中做了过多的计算占用了 UI 线程的时间 2.同上 3.Cell 中 view 的组织复杂,比如使用layer并不会有太大影响,但是如果layer使用了透明,或者圆角.变形等效果,就会影响到绘制速度. 关于第一点,首先要明白 tableview 的代理(这里指 datasource 和 delegate 的那套方法,下同)方法的调用顺序,和时机.对于一般的应用会有如下顺序: 1.向代理要 number Of Ro

iOS 保持界面流畅的技巧

这篇文章会非常详细的分析 iOS 界面构建中的各种性能问题以及对应的解决思路,同时给出一个开源的微博列表实现,通过实际的代码展示如何构建流畅的交互. Index演示项目屏幕显示图像的原理卡顿产生的原因和解决方案CPU 资源消耗原因和解决方案GPU 资源消耗原因和解决方案AsyncDisplayKitASDK 的由来ASDK 的资料ASDK 的基本原理ASDK 的图层预合成ASDK 异步并发操作Runloop 任务分发微博 Demo 性能优化技巧预排版预渲染异步绘制全局并发控制更高效的异步图片加载

联想S820 MIUI刷机包 MIUI 4.4.30 流畅运行 在线主题破解

ROM介绍 破解免费使用MIUI所有主题(方法:开机开启Root权限,进入WSM工具箱→安装二进制文件→重启→再次进入WSM工具箱→两个工具打上勾→重启),然后尽情奔放吧 .添加V4A音效 .添加安卓4.4切换特效 .加大外放音量,不爆音 .集成 WSM + Mi tools 工具 破解免费使用MIUI所有主题 .新版日历 .内核开启完整Root .添加定时开关机 .优化整体流畅度 .调整最低亮度为5 ,默认亮度为10 .开启CRT关屏效果 .降低按键振动幅度 .添加Emoji彩色表情 .优化W

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

最近用element来做项目,在开发的过程中,突然发现页面的操作和切换在数据量大的时候相当卡,后来提了个issue,在furybean解答后才知道,我每个单元格都加了tooltip,会生成大量的节点,造成页面操作卡顿.后来将tooltip去掉,操作流畅多了. 但是,由于我是将页面的数据存在vuex中的,在路由切换回来的时候,发现在数据量大的时候,页面渲染得很慢,大概两三秒才能切换过来,用户体验相当不好. 这时,我就在想,能不能让页面切换完成之后才开始渲染数据量大的组件,用户起码不会感知到路由切换

《屏幕上的聪明决策》:4星。人类在手机/电脑上做选择的心理学研究的综述。不流畅的文本有助于理解和记忆,淘汰赛制可以有效降低选择后懊悔。

本书是人类在手机/电脑上做选择的心理学研究的综述,比较可信,有许多有趣的事实与结论.比较重要的结论有这么几个:1:人类对网站.文章的判断很大程度上以来瞬间感知和审美:2:不流畅的文本有助于理解和记忆:3:可选项太多的情况下,可以考虑淘汰赛制,每次让用户从4个选项中选择一个最满意的.这样可以有效降低选择后懊悔. 总体评价4星. 以下是书中一些重要的结论与信息的摘抄,#号后面是kindle电子书中的页码: 1:人的注意力已经成为“21世纪的低硫原油”.如果可以控制人类注意力的杠杆,那么你几乎可以获取

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

GT源码:https://github.com/TencentOpen/GT 一.流畅度模块的代码结构 流畅度插件总共就几个类,其实处理方式也比较简单粗暴,就是通过Choreographer输出的log信息获取跳帧数据.SMActivity.java为插件的入口类,你可以通过预设环境操作来实现log打印操作,然后通过SMLogService.java过滤出当前进程的丢帧值,最后由SMServiceHelper.java来进行数据处理.流畅度值为60减去1s内的跳帧数. 二.流畅度测试 1.简要流