帧率(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 ...
随机推荐
- li 标签中放a 标签,文字垂直居中
<ul style="float:left"><li class="lili"> <a href="Left.aspx? ...
- 简单破解 Sencha Architect 2.2 (ExtJs Designer)
Sencha Architect 2是ExtJS和Sencha Touch的官方可视化IDE工具.最新版本是2.2,说是破解,其实是修改License来实现无限试用而已. 1.先下载安装官方软件,大约 ...
- 让ios项目同时支持ARC和非ARC
ttp://code4app.com/snippets/one/禁止某几个文件用ARC模式编译/502344256803fa246d000000#s0 如果你的绝大部分代码需要ARC,那么就设置项目支 ...
- Dual-polarity supply provides ±12V from one IC
LT1961 升压型稳压器造就了兼具升压和降压能力的扁平状SEPIC Transformerless dc/dc converter produces bipolar outputs Well-reg ...
- 原生JavaScript---正则表达式
JavaScript 中正则的性能比想象中的低很多.能用字符串方法搞定的,尽量别用正则.------玉伯 抛开性能不谈,一起来看看正则表达式怎么用吧! 先看看JavaScript正则表达式中一些特殊字 ...
- 使用 HAProxy, PHP, Redis 和 MySQL 轻松构建每周上亿请求Web站点
国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私 ...
- SpringMVC整合fastjson、easyui 乱码问题
一.框架版本 SpringMVC:3.1.1.RELEASE fastjson:1.2.7 easyui :1.4.5 二.乱码现象 Action中使用@ResponseBody返回Json数据 ...
- 最好的 NMAP 扫描策略
# 适用所有大小网络最好的 nmap 扫描策略 # 主机发现,生成存活主机列表 $ nmap -sn -T4 -oG Discovery.gnmap 192.168.56.0/24 $ grep &q ...
- javascript转换日期字符串为Date对象
把一个日期字符串如“2007-2-28 10:18:30”转换为Date对象: 1: var strArray=str.split(" "); var strDate=strArr ...
- cocos2d-x v3.0新特性及使用
八月份cocos2d-x官网发布了v3.0版本,这次更新的内容特别多,包括2dx的架构以及使用 总得来说,给开发者带来了很大的便利: 运行环境需求: Android 2.3 or newer iOS ...