今天寫遊戲需要計算FPS,就在網上搜到了Loon的一個java 遊戲計算FPS的類,修改了一下如下(著作權屬原作者):
package com.px.FPS;<br />import java.text.DecimalFormat;<br />/**<br /> *<br /> */<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 /> */<br />public class CFPSMaker<br />{<br /> /**<br /> * 設定動畫運行多少幀後統計一次幀數<br /> */<br /> public static final int FPS = 8; </p><p> /**<br /> * 換算為運行周期<br /> * 單位: ns(納秒)<br /> */<br /> public static final long PERIOD = (long) (1.0 / FPS * 1000000000);<br /> /**<br /> * FPS最大間隔時間,換算為1s = 10^9ns<br /> * 單位: ns<br /> */<br /> public static long FPS_MAX_INTERVAL = 1000000000L; </p><p> /**<br /> * 實際的FPS數值<br /> */<br /> private double nowFPS = 0.0;</p><p> /**<br /> * FPS累計用間距時間<br /> * in ns<br /> */<br /> private long interval = 0L;<br /> private long time;<br /> /**<br /> * 運行楨累計<br /> */<br /> private long frameCount = 0;</p><p> /**<br /> * 格式化小數位元<br /> */<br /> private DecimalFormat df = new DecimalFormat("0.0"); </p><p> /**<br /> * 製造FPS資料<br /> *<br /> */<br /> public void makeFPS()<br /> {<br /> frameCount++;<br /> interval += PERIOD;<br /> //當實際間隔符合時間時。<br /> if (interval >= FPS_MAX_INTERVAL)<br /> {<br /> //nanoTime()返回最準確的可用系統計時器的當前值,以毫微秒為單位<br /> long timeNow = System.nanoTime();<br /> // 獲得到目前為止的時間距離<br /> long realTime = timeNow - time; // 單位: ns<br /> //換算為實際的fps數值<br /> nowFPS = ((double) frameCount / realTime) * FPS_MAX_INTERVAL;</p><p> //變更數值<br /> frameCount = 0L;<br /> interval = 0L;<br /> time = timeNow;<br /> }<br /> }</p><p> public long getFrameCount()<br /> {<br /> return frameCount;<br /> }</p><p> public void setFrameCount(long frameCount)<br /> {<br /> this.frameCount = frameCount;<br /> }</p><p> public long getInterval()<br /> {<br /> return interval;<br /> }</p><p> public void setInterval(long interval)<br /> {<br /> this.interval = interval;<br /> }</p><p> public double getNowFPS()<br /> {<br /> return nowFPS;<br /> }</p><p> public void setNowFPS(double nowFPS)<br /> {<br /> this.nowFPS = nowFPS;<br /> }</p><p> public long getTime()<br /> {<br /> return time;<br /> }</p><p> public void setTime(long time)<br /> {<br /> this.time = time;<br /> }</p><p> public String getFPS()<br /> {<br /> return df.format(nowFPS);<br /> }<br />}
簡單的使用方法:
首先,初始化一個FPSMaker執行個體
CFPSMaker fpsMaker;<br />fpsMaker = new CFPSMaker();<br />
然後,在需要計算FPS時初始化以下目前時間:
fpsMaker.setNowFPS(System.nanoTime());
最後,在遊戲迴圈中計算和顯示當前遊戲幀速:
fpsMaker.makeFPS();<br />GameManager.drawFPS(fpsMaker.getFPS() + " FPS");
OVER!