原文地址: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)计算的六种方法总结的更多相关文章

  1. android中实现view可以滑动的六种方法

    在android开发中,经常会遇到一个view需要它能够支持滑动的需求.今天就来总结实现其滑动的六种方法.其实每一种方法的 思路都是一样的,即:监听手势触摸的坐标来实现view坐标的变化,从而实现vi ...

  2. Android View体系(二)实现View滑动的六种方法

    1.View的滑动简介 View的滑动是Android实现自定义控件的基础,同时在开发中我们也难免会遇到View的滑动的处理.其实不管是那种滑动的方式基本思想都是类似的:当触摸事件传到View时,系统 ...

  3. Android应用帧率--FPS测试

    Android应用帧率FPS是衡量应用流畅度的一个非常重要的指标,可以根据FPS对应用做一些优化,那么在开发过程中如何来测试我们的应用的FPS呢? 准备工具:Eclipse + Android测试终端 ...

  4. android中实现view可以滑动的六种方法续篇(二)

    承接上一篇,上一篇中讲解了实现滑动的第五种方法,如果你还没读过,可点击下面链接: http://www.cnblogs.com/fuly550871915/p/4985482.html 这篇文章现在来 ...

  5. Java读取Properties文件的六种方法

    使用J2SE API读取Properties文件的六种方法 1.使用java.util.Properties类的load()方法示例: InputStream in = lnew BufferedIn ...

  6. 关于字符串计算size的方法比较

    往往字符串需要计算size来满足UI排版的自适应的需要,而一般字符串也是放在UILabel里的. 而在计算size的方法里,一般有两种方式(deprecated的就不说了). NSString的方法 ...

  7. Css实现垂直水平居中的六种方法

    经常在项目中用到,今天总结了一下: 演示地址:http://codepen.io/anon/pen/xGdpOa 以下两个类为公共类,便于更好的显示效果,非核心代码 .common{ width: 6 ...

  8. javaSE读取Properties文件的六种方法

    使用JavaSEAPI读取Properties文件的六种方法 1.使用java.util.Properties类的load()方法 示例:InputStreamin=lnewBufferedInput ...

  9. (转)java判断string变量是否是数字的六种方法小结

    java判断string变量是否是数字的六种方法小结 (2012-10-17 17:00:17) 转载▼ 标签: it 分类: 转发 1.用JAVA自带的函数 public static boolea ...

随机推荐

  1. myBatis 切换数据源(spring事务)理解

    1. mybatis (SqlSessionTemplate)的动态代理 a) sqlSession的结构 b)SqlSession 结构 public class SqlSessionTemplat ...

  2. WPF: 使用CommandManager.InvalidateRequerySuggested手动更新Command状态

    WPF判断命令(Command)是否能够执行是通过ICommand.CanExecute事件,在实际程序中路由命令一般是通过CommandBinding来使命令得到实际操作代码,但是这个CanExec ...

  3. 【mysql】mysql统计查询count的效率优化问题

    mysql统计查询count的效率优化问题 涉及到一个问题 就是 mysql的二级索引的问题,聚簇索引和非聚簇索引 引申地址:https://www.cnblogs.com/sxdcgaq8080/p ...

  4. jq幻灯片2013-8-31

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  5. OAuth:第一天学习OAuth

    收集的一些资料 http://baike.baidu.com/view/3948029.htm. http://oauth.net/. 使用百度的OAuth服务进行测试 代码下载:http://yun ...

  6. Android Studio调试报错am startservice

    今天下载了一个Android studio2.3.0版本,想调试一下自己的一个项目,但是发现项目编译运行正常,但是一调试就报错: 09/14 16:19:13: Launching app$ adb ...

  7. Mysql优化与使用集锦

    MyISAM的读性能是比Innodb强 MyISAM的索引和数据是分开的,并且索引是有压缩的 Innodb是索引和数据是紧密捆绑的,没有使用压缩从而会造成Innodb比MyISAM体积庞大不小 MyI ...

  8. 通过Spring配置文件中bean中的property赋值

    基本数据类型赋值-通过spring配置文件中bean中的property 扩展-以此方式可以通过配置为连接数据的属性赋值 1.如果是基本数据类型,可以通过setter方法为对象中的属性设置初始值,应用 ...

  9. Ubuntu下如何安装与运行Redis

    内容中包含 base64string 图片造成字符过多,拒绝显示

  10. TensorFlow 入门 上(自用)

    下文会出现的一些知识点:TensorFlow的计算模型.数据模型.运行模型,TensorFlow的工作原理. 两个重要概念——Tensor和Flow: Tensor是张量,在TensorFlow中可以 ...