gooブログはじめました!

写真付きで日記や趣味を書くならgooブログ

android fps計算

2010-08-28 08:51:52 | android

androidでfpsを計算するclassを作成

fps計算

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

コメントを投稿