androidでfpsを計算するclassを作成
<form><textarea rows="8" cols="75" readonly="readonly">package org.jp.Box2dTest; import java.text.DecimalFormat; import java.util.LinkedList; import android.os.SystemClock; import android.util.Log; public class FPS { private int m_sampleNum; // サンプル数 private float m_fps; // fps private long m_oldTime; // 前回getFPSを呼び出した時間 private long m_diffTime; // 前回の時間差分 private long m_sumTime; // 経過時間の和 // private Vector<Long> _timeList; //経過時間のテーブル private LinkedList<Long> m_timeList; private DecimalFormat df = new DecimalFormat( "0.0" ); // ------ここから移動平均によってFPSを算出している(fpsにあわせるためのwait処理なし) public void Init() { // sample数の指定しなければ10回サンプリング Init( 10 ); } /** * @param iSampleNum サンプリング周波数(精度が必要な場合はこの値を増やす) */ public void Init(int iSampleNum) { // サンプリング数 m_sampleNum = iSampleNum; m_oldTime = 0; m_diffTime = 0; m_sumTime = 0; //サンプリングされたものを、移動平均で算出するためLinkedListを使う m_timeList = new LinkedList<Long>(); for ( int i = 0; i <iSampleNum; i++ ) { m_timeList.add( 0L ); } } /** * 移動平均によってFPSを算出する。 * * 移動平均説明(サンプリング数5の場合) * 1回目のデータ算出 10,11,12,13,15,14 * * 1回目のfps 計算 (10 + 11 + 12 + 13 + 15) / 5 * 2回目のfps計算 (11 + 12 + 13 + 15 + 14 ) / 5 (一番古いデータは計算に使わない) */ public void calcFPS() { long nowTime = SystemClock.uptimeMillis(); m_diffTime = nowTime -m_oldTime; m_oldTime = nowTime; m_sumTime += m_diffTime; // // double doldestdata = _timeList.get( location ) m_timeList.add( m_diffTime ); // // 一番古いやつは削除(移動平均で算出) m_sumTime -= m_timeList.poll(); // // 平均時間 long tmp = m_sumTime /m_sampleNum; // FPS if (tmp !=0l) { m_fps = 1000.0f /tmp; } else { m_fps = 0.0f; } } /** * 指定したサンプリング数で算出した現在のFPS * * @return 現在のFPS (wait処理なし) */ public String GetFPS() { return df.format( m_fps ); } // ------ここまで移動平均によってFPSを算出している(fpsにあわせるためのwait処理なし) // ----- ここから FPSを合わせるためのwait処理あり() //DxLibの龍神録を参考にしたFPS計算 ほぼそのまま javaに変更しただけ private static final int FRAME = 40; //FPS この部分を変更すればfpsを変更できる。 携帯では40fps程度でok 60fpsはオブジェクトを増やすときつい private int m_fps_count; private long m_count0t; private long[] F = new long[FRAME]; private static long m_frame; private double m_ave; /** * メンバ変数で設定したFPSにあわせるためのwait処理 */ public void fps_wait() { long term, gnt; if( m_fps_count ==0 ) { if ( m_frame ==0 ) { // 最初のフレーム term = 0; } else { // //前回記録した時間を元に計算 term = m_count0t +1000 -System.currentTimeMillis(); // term = _count0t + 1000000000 - System.nanoTime(); } } else { // 待つべき時間=現在あるべき時刻-現在の時刻 term = m_count0t +m_fps_count *( 1000 /FRAME ) -System.currentTimeMillis(); } if ( term > 0 ) { try { Log.d( "MyLOG", "term:" +String.valueOf( term ) ); Thread.sleep( term ); } catch ( InterruptedException ex ) { ex.printStackTrace(); Log.d( "MyLOG", "Thread sleep exception" ); } } gnt = System.currentTimeMillis(); if( m_fps_count ==0 ) { // 指定されたフレームごとに基準をつくりなおし //40 fpsの場合 40 % 40 で0になる, m_count0t = gnt; } F[m_fps_count] = gnt -m_frame; m_frame = gnt; if( m_fps_count ==FRAME -1 ) { m_ave = 0; for ( int count = 0; count <FRAME; count++ ) { m_ave += F[count]; } m_ave /= FRAME; } m_fps_count = ( ++m_fps_count ) %FRAME; } /** * 現在のFPS * * @return 現在のFPS (wait処理つき) */ public String GetFPS2() { if ( m_ave !=0 ) { double fps = ( 1000 /m_ave ); return df.format( fps ); } else { return ""; } } } </textarea>
</form>
※コメント投稿者のブログIDはブログ作成者のみに通知されます