java fps计算_帧率(FPS)计算的六种方法总结

帧率(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(1.f / deltaTime * 1000); // 别忘了先转换为浮点数,否则会有精度丢失

return fps;

}

四、总平均法

总平均法使用全局帧数除以全局时间,以求出帧率。

int beginTime = getTime();

int fps()

{

static int frameCount = 0;

++frameCount;

int deltaTime = getTime() - beginTime();

return static_cast(frameCount * 1.f / deltaTime * 1000); // 别忘了先转换为浮点数,否则会有精度丢失

}

五、精确采样法

精确采样法采样前N个帧,然后计算平均值。此种方法需要额外的内存空间,所以不常用。

int fps(int deltaTime) // ms

{

static std::queue q;

static int sumDuration = 0; // ms

int fps = 0;

if (q.size() < 100) // 样本数设为100

{

sumDuration += deltaTime;

q.push(deltaTime);

fps = static_cast(q.size() * 1.f / sumDuration * 1000.f); // 别忘了转换为浮点数,否则会有精度丢失

}

else

{

sumDuration -= q.front();

sumDuration += deltaTime;

sumDuration.pop();

sumDuration.push(deltaTime);

fps = static_cast(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(deltaTime);

}

else

{

avgDuration = avgDuration * (1 - alpha) + deltaTime * alpha;

}

fps = static_cast(1.f / avgDuration * 1000);

return 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 ...

&lpar;转&rpar;java判断string变量是否是数字的六种方法小结

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

随机推荐

varnish 隐藏版本号

varnish 隐藏方法: 修改default.vcl配置文件. 找到或添加 vcl_deliver 子程序,代码如下: 1 2 3 4 5 sub vcl_deliver {        unse ...

九、UINavigationController切换视图 实例

现版本 SDK 8.4 Xcode 运行Xcode 选择 Create a new Xcode project ->Single View Application 命名 NavigationCo ...

HTTP详解2-请求、响应、缓存

1. HTTP请求格式 做过Socket编程的人都知道,当我们设计一个通信协议时,“消息头/消息体”的分割方式是很常用的,消息头告诉对方这个消息是干什么的,消息体告诉对方怎么干.HTTP协议传输的消息 ...

BZOJ 2658 小蓝的好友

题目链接:http://www.lydsy.com:808/JudgeOnline/problem.php?id=2658 题意:给出一个n*m的格子.某些格子中有障碍.求包含至少一个障碍的矩形有多少 ...

Jenkins 安装与配置

1. 软件准备 a. 下载 jenkins.war:https://wiki.jenkins-ci.org/display/JENKINS/Meet+Jenkins. 本文以 Jenkins 为演示版 ...

PowerShell因为在此系统中禁止执行脚本解决方法

PowerShell因为在此系统中禁止执行脚本解决方法   在Powershell直接脚本时会出现: 无法加载文件 ******.ps1,因为在此系统中禁止执行脚本.有关详细信息,请参阅 " ...

&lbrack;AndroidTips&rsqb;startService与bindService的区别

Service的生命周期方法比Activity少一些,只有onCreate, onStart, onDestroy我们有两种方式启动一个Service,他们对Service生命周期的影响是不一样的. ...

Python 用下划线作为变量前缀和后缀指定特殊变量

_xxx 不能用’from module import *’导入 __xxx__ 系统定义名字 __xxx 类中的私有变量名 核心风格:避免用下划线作为变量名的开始. 因为下划线对解释器有特殊的意义, ...

有哪些Java性能优化方法?

面试官:"有性能优化经验没?"  应聘者:"有一点."   面试官:"那你们从哪些方面做了优化?"   应聘者:"sql优化.JV ...

利用random模块生成验证码

random模块 该模块用于数学或者数据相关的领域,使用方法非常简单下面介绍常用的放法 1.随机小数 random.random() 2.随机整数random.randint(1,5) # 大于等于1 ...

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值