JAVA图形操作中FPS的计算

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

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

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

代码如下:

FPS部分相关源码:

package org.test;<br />import java.text.DecimalFormat;<br />/**<br />* <p>Title: LoonFramework</p><br />* <p>Description:</p><br />* <p>Copyright: Copyright (c) 2007</p><br />* <p>Company: LoonFramework</p><br />* @author chenpeng  <br />* @email:ceponline@yahoo.com.cn<br />* @version 0.1<br />*/<br />public class FPSListen {<br />    //设定动画的FPS桢数,此数值越高,动画速度越快。<br />    public static final int FPS = 500;  <br />    // 换算为运行周期<br />    public static final long PERIOD = (long) (1.0 / FPS * 1000000000); // 单位: ns(纳秒)<br />    // FPS最大间隔时间,换算为1s = 10^9ns<br />    public static long FPS_MAX_INTERVAL = 1000000000L; // 单位: ns<br />    <br />    // 实际的FPS数值<br />    private double nowFPS = 0.0;<br />    <br />    // FPS累计用间距时间<br />    private long interval = 0L; // in ns<br />    private long time;<br />    //运行桢累计<br />    private long frameCount = 0;<br />    <br />    //格式化小数位数<br />    private DecimalFormat df = new DecimalFormat("0.0");<br />    //开启opengl<br />    public void opengl(){<br />        System.setProperty("sun.java2d.opengl", "True");<br />        System.setProperty("sun.java2d.translaccel", "True");<br />    }<br />  <br />    /** *//**<br />     * 制造FPS数据<br />     *<br />     */<br />    public void makeFPS() {<br />        frameCount++;<br />        interval += PERIOD;<br />        //当实际间隔符合时间时。<br />        if (interval >= FPS_MAX_INTERVAL) {<br />            //nanoTime()返回最准确的可用系统计时器的当前值,以毫微秒为单位<br />            long timeNow = System.nanoTime();<br />            // 获得到目前为止的时间距离<br />            long realTime = timeNow - time; // 单位: ns<br />            //换算为实际的fps数值<br />            nowFPS = ((double) frameCount / realTime) * FPS_MAX_INTERVAL;<br />            //变更数值<br />            frameCount = 0L;<br />            interval = 0L;<br />            time = timeNow;<br />        }<br />    }<br />    public long getFrameCount() {<br />        return frameCount;<br />    }<br />    public void setFrameCount(long frameCount) {<br />        this.frameCount = frameCount;<br />    }<br />    public long getInterval() {<br />        return interval;<br />    }<br />    public void setInterval(long interval) {<br />        this.interval = interval;<br />    }<br />    public double getNowFPS() {<br />        return nowFPS;<br />    }<br />    public void setNowFPS(double nowFPS) {<br />        this.nowFPS = nowFPS;<br />    }<br />    public long getTime() {<br />        return time;<br />    }<br />    public void setTime(long time) {<br />        this.time = time;<br />    }<br />    public String getFPS(){<br />        return df.format(nowFPS);<br />    }<br />}

球体类相关代码:

package org.test;import java.awt.Color;import java.awt.Graphics;/** *//*** 

Title: LoonFramework

*

Description:

*

Copyright: Copyright (c) 2007

*

Company: LoonFramework

* @author chenpeng  * @email:ceponline@yahoo.com.cn* @version 0.1*/public class Ball {        private static final int SIZE = 10;        private int x, y;        protected int vx, vy;        public Ball(int x, int y, int vx, int vy) {            this.x = x;            this.y = y;            this.vx = vx;            this.vy = vy;        }        public void move() {            x += vx;            y += vy;            if 现在睡觉的话,会做梦;而现在学习的话,会让梦实现。

JAVA图形操作中FPS的计算

相关文章:

你感兴趣的文章:

标签云: