帧率(FPS)计算的六种方法总结
原文地址:http://blog.csdn.net/u012494876/article/details/53368164
帧率(FPS)计算是游戏编程中常见的一个话题。大体来说,总共有如下六种方法:
一、固定时间帧数法
帧率计算的公式为:
fps = frameNum / elapsedTime;
如果记录固定时间内的帧数,就可以计算出同步率。此种方法用得较多。
int fps()
{
static int fps = 0;
static int lastTime = getTime(); // ms
static int frameCount = 0;
++frameCount;
int curTime = getTime();
if (curTime - lastTime > 1000) // 取固定时间间隔为1秒
{
fps = frameCount;
frameCount = 0;
lastTime = curTime;
}
return fps;
}
还有另一种写法:
int fps(int deltaTime)
{
static int fps = 0;
static int timeLeft = 1000; // 取固定时间间隔为1秒
static int frameCount = 0;
++frameCount;
timeLeft -= deltaTime;
if (timeLeft < 0)
{
fps = frameCount;
frameCount = 0;
timeLeft = 1000;
}
return fps;
}
二、固定帧数时间法
帧率计算的公式为:
fps = frameNum / elapsedTime;
- 1
如果每隔固定的帧数,计算帧数使用的时间,也可求出帧率。此种方法使用得较少。
int fps()
{
static int fps = 0;
static int frameCount = 0;
static int lastTime = getTime(); // ms
++frameCount;
if (frameCount >= 100) // 取固定帧数为100帧
{
int curTime = getTime();
fps = frameCount / (curTime - lastTime) * 1000;
lastTime = curTime;
frameCount = 0;
}
return fps;
}
三、实时计算法
实时计算法直接使用上一帧的时间间隔进行计算,结果具有实时性,但平滑性不好。
int fps(int deltaTime) // ms
{
int fps = static_cast<int>(1.f / deltaTime * 1000); // 别忘了先转换为浮点数,否则会有精度丢失
return fps;
}
四、总平均法
总平均法使用全局帧数除以全局时间,以求出帧率。
int beginTime = getTime();
int fps()
{
static int frameCount = 0;
++frameCount;
int deltaTime = getTime() - beginTime();
return static_cast<int>(frameCount * 1.f / deltaTime * 1000); // 别忘了先转换为浮点数,否则会有精度丢失
}
五、精确采样法
精确采样法采样前N个帧,然后计算平均值。此种方法需要额外的内存空间,所以不常用。
int fps(int deltaTime) // ms
{
static std::queue<int> q;
static int sumDuration = 0; // ms
int fps = 0;
if (q.size() < 100) // 样本数设为100
{
sumDuration += deltaTime;
q.push(deltaTime);
fps = static_cast<int>(q.size() * 1.f / sumDuration * 1000.f); // 别忘了转换为浮点数,否则会有精度丢失
}
else
{
sumDuration -= q.front();
sumDuration += deltaTime;
sumDuration.pop();
sumDuration.push(deltaTime);
fps = static_cast<int>(100.f / sumDuration * 1000.f); // 别忘了转换为浮点数,否则会有精度丢失
}
return fps;
}
六、平均采样法
平均采样法利用上次的统计结果,克服了精确采样法需要使用额外空间的缺点。此种方法较常用。
int fps(int deltaTime) // ms
{
static float avgDuration = 0.f;
static alpha = 1.f / 100.f; // 采样数设置为100
static int frameCount = 0;
++frameCount;
int fps = 0;
if (1 == frameCount)
{
avgDuration = static_cast<float>(deltaTime);
}
else
{
avgDuration = avgDuration * (1 - alpha) + deltaTime * alpha;
}
fps = static_cast<int>(1.f / avgDuration * 1000);
return fps;
}
帧率(FPS)计算的六种方法总结的更多相关文章
- android中实现view可以滑动的六种方法
在android开发中,经常会遇到一个view需要它能够支持滑动的需求.今天就来总结实现其滑动的六种方法.其实每一种方法的 思路都是一样的,即:监听手势触摸的坐标来实现view坐标的变化,从而实现vi ...
- Android View体系(二)实现View滑动的六种方法
1.View的滑动简介 View的滑动是Android实现自定义控件的基础,同时在开发中我们也难免会遇到View的滑动的处理.其实不管是那种滑动的方式基本思想都是类似的:当触摸事件传到View时,系统 ...
- Android应用帧率--FPS测试
Android应用帧率FPS是衡量应用流畅度的一个非常重要的指标,可以根据FPS对应用做一些优化,那么在开发过程中如何来测试我们的应用的FPS呢? 准备工具:Eclipse + Android测试终端 ...
- android中实现view可以滑动的六种方法续篇(二)
承接上一篇,上一篇中讲解了实现滑动的第五种方法,如果你还没读过,可点击下面链接: http://www.cnblogs.com/fuly550871915/p/4985482.html 这篇文章现在来 ...
- Java读取Properties文件的六种方法
使用J2SE API读取Properties文件的六种方法 1.使用java.util.Properties类的load()方法示例: InputStream in = lnew BufferedIn ...
- 关于字符串计算size的方法比较
往往字符串需要计算size来满足UI排版的自适应的需要,而一般字符串也是放在UILabel里的. 而在计算size的方法里,一般有两种方式(deprecated的就不说了). NSString的方法 ...
- Css实现垂直水平居中的六种方法
经常在项目中用到,今天总结了一下: 演示地址:http://codepen.io/anon/pen/xGdpOa 以下两个类为公共类,便于更好的显示效果,非核心代码 .common{ width: 6 ...
- javaSE读取Properties文件的六种方法
使用JavaSEAPI读取Properties文件的六种方法 1.使用java.util.Properties类的load()方法 示例:InputStreamin=lnewBufferedInput ...
- (转)java判断string变量是否是数字的六种方法小结
java判断string变量是否是数字的六种方法小结 (2012-10-17 17:00:17) 转载▼ 标签: it 分类: 转发 1.用JAVA自带的函数 public static boolea ...
随机推荐
- [转译] AD RMS 安装最佳实践
在安装活动目录权限管理服务(ADRMS)时,请牢记以下几点: 将 AD RMS服务单独安装在一台服务器上——将 AD RMS与域控制器.微软邮件服务器(Microsoft Exchange Serve ...
- What is the fastest way of (not) logging?
原文地址:http://www.slf4j.org/faq.html#logging_performance SLF4J supports an advanced feature called par ...
- Android支付接入之Google In-app-Billing
原文链接:http://www.mobile-open.com/2016/966337.html 因为公司需要接入Google的应用内支付(即Google的in-app Billing V3),接入过 ...
- [Hive]使用HDFS文件夹数据创建Hive表分区
描写叙述: Hive表pms.cross_sale_path建立以日期作为分区,将hdfs文件夹/user/pms/workspace/ouyangyewei/testUsertrack/job1Ou ...
- jQuery 对象和 DOM 对象
jQuery(DOM对象) 或者 $(DOM对象) 此函数的作用是将DOM对象,转换为jQuery的对象 DOM对象其实就是javascript的函数对象,可以用来操作所有HTML元素.比如: a标签 ...
- highchart demo
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.c ...
- docker学习总结--安装、卸载
参考:http://blog.csdn.net/u012562943/article/details/50463400 https://docs.docker.com/engine/getstarte ...
- 会话追踪(session tracking)
HTTP是一种无连接的协议,如果一个客户端只是单纯地请求一个文件(HTML或GIF),服务器端可以响应给客户端,并不需要知道一连串的请求是否来自于相同的客户端,而且也不需要担心客户端是否处在连接状态. ...
- C#实现两个数据库之间的数据上报
用VS2008实现本地数据库上传数据到远程数据.数据能够是一个表,或一个表的部分数据.或查询数据.或数据编辑后上传. 其他VS版本号.复制当中代码就能够.未使用其他不论什么插件.有具体凝视. 单独页面 ...
- 在 WF 4 中编写自定义控制流活动
在 WF 4 中编写自定义控制流活动 Leon Welicki 控制流是指组织和执行程序中各个指令的方法. 在 Windows Workflow Foundation 4 (WF 4) 中,控制流活动 ...