Welcome 微信登录

首页 / 软件开发 / JAVA / JAVA图形操作中FPS的计算

JAVA图形操作中FPS的计算2011-08-18FPS:即帧 /秒(frames per second)的缩写,也称为帧速率。是指1秒钟时间里刷新的图片的帧数,也可以理解为图形处理器每秒钟能够刷新几次。如果具体到手机上就是指每秒钟能够播放(或者录制)多少格画面。同时越高的帧速率可以得到更流畅、更逼真的动画。每秒钟帧数(fps)越多,所显示的动作就会越流畅。

在绝大多数图形程序中(以游戏类为典型),执行效率都以FPS作为评估标准。

由于目前JAVA方面缺少相关用例,故完成功能如下图(在本机测试中,最大fps设定为500,实际达到FPS效率在IDE中280左右,单独运行380左右,受系统配置等因素影响):

代码如下:

FPS部分相关源码:

package org.test;
import java.text.DecimalFormat;
/**
* <p>Title: LoonFramework</p>
* <p>Description:</p>
* <p>Copyright: Copyright (c) 2007</p>
* <p>Company: LoonFramework</p>
* @author chenpeng
* @email:ceponline@yahoo.com.cn
* @version 0.1
*/
public class FPSListen {
//设定动画的FPS桢数,此数值越高,动画速度越快。
public static final int FPS = 500;
// 换算为运行周期
public static final long PERIOD = (long) (1.0 / FPS * 1000000000); // 单位: ns(纳秒)
// FPS最大间隔时间,换算为1s = 10^9ns
public static long FPS_MAX_INTERVAL = 1000000000L; // 单位: ns

// 实际的FPS数值
private double nowFPS = 0.0;

// FPS累计用间距时间
private long interval = 0L; // in ns
private long time;
//运行桢累计
private long frameCount = 0;

//格式化小数位数
private DecimalFormat df = new DecimalFormat("0.0");
//开启opengl
public void opengl(){
System.setProperty("sun.java2d.opengl", "True");
System.setProperty("sun.java2d.translaccel", "True");
}

/** *//**
* 制造FPS数据
*
*/
public void makeFPS() {
frameCount++;
interval += PERIOD;
//当实际间隔符合时间时。
if (interval >= FPS_MAX_INTERVAL) {
//nanoTime()返回最准确的可用系统计时器的当前值,以毫微秒为单位
long timeNow = System.nanoTime();
// 获得到目前为止的时间距离
long realTime = timeNow - time; // 单位: ns
//换算为实际的fps数值
nowFPS = ((double) frameCount / realTime) * FPS_MAX_INTERVAL;
//变更数值
frameCount = 0L;
interval = 0L;
time = timeNow;
}
}
public long getFrameCount() {
return frameCount;
}
public void setFrameCount(long frameCount) {
this.frameCount = frameCount;
}
public long getInterval() {
return interval;
}
public void setInterval(long interval) {
this.interval = interval;
}
public double getNowFPS() {
return nowFPS;
}
public void setNowFPS(double nowFPS) {
this.nowFPS = nowFPS;
}
public long getTime() {
return time;
}
public void setTime(long time) {
this.time = time;
}
public String getFPS(){
return df.format(nowFPS);
}
}