home > programming > notes >

フレームレートの計測

フレームレートは1秒間に何回画面を書き換えるかを表す指標で、単位はfps(frames per second)です。

ゲームのフレームレートを計測する目的は、主に処理落ちやコマ落ちの検知です。PCではユーザーのマシンの能力にばらつきがあるため、画面にフレームレートを表示するゲームが多いです。

フレームレートを計算するのにも細かいやり方の違いがいくつもあると思うのですが、自分は以下のような方法を使っています。

現在の時間を基準時間とし、基準時間から1秒以上経過するまで画面の描画回数をカウントします。画面が描画されたときに基準時間から1秒以上過ぎていれば、画面の描画回数を経過時間で割ったものでフレームレート値を更新し、現在の時間を基準時間として、描画回数をリセットします。

この方法の特徴は、

・フレームレートの計測間隔は1秒「以上」です。通常はほぼ1秒になります。あまり頻繁に更新しても、画面に表示したフレームレートが読み取れなくて困るのでこうしてます。処理が重いときには間隔が長くなる可能性があります。

・フレームレートの値が小数になります。整数で表示するより、少しカッコがつきます(?)。

このフレームレート計測をJavaのクラスにしたものは以下のようになります。

class FrameRate {
    
    private long    basetime;   //測定基準時間
    private int     count;      //フレーム数
    private float   framerate;  //フレームレート
    
    //コンストラクタ
    public FrameRate() {
        basetime = System.currentTimeMillis();  //基準時間をセット
    }

    //フレームレートを取得
    public float getFrameRate() {
        return framerate;
    }

    //描画時に呼ぶ
    public void count() {
        ++count;        //フレーム数をインクリメント
        long now = System.currentTimeMillis();      //現在時刻を取得
        if (now - basetime >= 1000)
        {       //1秒以上経過していれば
            framerate = (float)(count * 1000) / (float)(now - basetime);        //フレームレートを計算
            basetime = now;     //現在時刻を基準時間に
            count = 0;          //フレーム数をリセット
        }
    }
}

ゲームの描画メソッドが実行されるたびにcount()メソッドが呼ばれるようにして、あとはgetFrameRate()で取得したフレームレートを表示すればいいだけです。