作者:StrongCoding
邮箱:StrongCoding@qq.com DX群:130302441
若文中有误,请告知.十分感谢.一起加油.
在测试软件中,我们经常需要查看程序的渲染速度是否合理,所以,我们就有必要记录一下程序在大于等于1秒的持续调用某函数的情况下,需要记录下该函数到底被调用了多少次,以此来反馈帧速率。为了实现这个目的,我们需要这样子做:
实现思路:
1、首先记录下程序在一开始进入While循环的时候,并且没有响应任何事件的时候,需要保存一下当前的时间值A。然后当程序再次执行到该处时又得到了一个当前程序的运行时B。因此B-A,就是程序再次路过没有响应事件的时间调用差值C
2、再一个我们需要一个函数来专门的统计帧速率,在准备这个函数之前呢,我们需要有两个重要的计数器:
(1)计算时间差的计数器static float AllTimes
(2)计算总帧速率的计数器static int FrameCounts
这是计算帧速率最关键的两个变量. OK,由于C会不停的传入到帧速率函数中,且时间差AllTimes+=C, FrameCounts++
解释:
有的人认为,当程序走到统计帧速率函数的时候,意味着就可以计算帧速率了,其实不然,因为当今的CPU运行速度太快了,这个函数在一秒内会被调用数不清的次数,至少我是数不过来呵呵. 还有就是由于该帧速率函数在1秒内会被不停调用N次,所以传入的值绝对不会超过1秒,除非你的机子已经烂的不行了。所以,我们需要统计出,在一秒内,我们的程序到底调用了多少次,所以就有了我们的FrameCounts++;而后,我们需要累加这些短的不能再短的时间,直到攒的这些碎时间达到一秒或者稍微超过点,这时候,我们才能在一秒内,平均统计下该函数的调用速率:
我们用float FPS保存: FPS = (float)(FrameCounts / AllTimes);
这样我们就得到了我们想要的帧速率。
再一个,就是计算出来后,我们总不能调试查看吧,所以,我们需要把它打印到屏幕上,怎么实现字体这块就不说了,因为FPS是一个float型的,我们不能直接打印,需要将其转换成字符串形式,好吧那就定义成char数组吧:
char Fps[9];
利用C语言格式化一下:sprintf( Fps, "%f", FPS );
Fps[8] = "/0";
OK,转换完成,这时候你就可以直接打印到屏幕了。
最后一个你需要收尾:将两个计数器归0。
【DX9基础|计算帧速率】 看下效果吧,呵呵.
推荐阅读
- 面试|我经历的IT公司面试及离职感受(转)
- c/c++|有感 Visual Studio 2015 RTM 简介 - 八年后回归 Dot Net,终于迎来了 Mvc 时代,盼走了 Web 窗体时代...
- C/C++|C/C++ basis 02
- Asp.net|System.Globalization.DateTimeFormatInfo.InvariantInfo
- Qt实战|Qt+OpenCV联合开发(二十一)--图像翻转与旋转
- Qt实战|Qt+OpenCV联合开发(十四)--图像感兴趣区域(ROI)的提取
- Qt实战|Qt+OpenCV联合开发(十三)--通道分离与合并
- opencv|Qt+OpenCV联合开发(十六)--图像几何形状绘制
- Qt实战|Qt+OpenCV联合开发(十七)--随机数与随机颜色