新人日誌4

動画を編集する機会があり、

動画のフレームレートを安定させるための制御をkotlinで書いてみました。

まずメンバ変数の宣言と初期化です。

//1秒(ミリ秒) 
    private val ONESEC = 1000L
//1秒あたり最大フレームレート
    private var mMaxfps = 30.0
//誤差
    private var mError = 0L
//理想的なウェイト時間
    private var mIdealwait = 0L
//ループ更新前の時間
    private var mOldtime = 0L
//ループ更新後の時間
    private var mNewtime = 0L
//ウェイト実施前の時間
    private var mWaitOldtime = 0L
//ウェイト実施後の時間
    private var mWaitNewtime = 0L
//実際のウェイト時間
    private var mWait = 0L

次に初期設定を行うメソッドをInitとします。

引数で渡した値が最大フレームレートになります。

//初期設定メソッド
     fun Init(fps:Double)
     {
         //引数で渡された最大フレームレートを設定
        mMaxfps = fps
        //誤差を0で初期化
        mError = 0L
        //最大フレームレート分の1秒が理想的なウェイト時間
        //(currentTimeMillisと合わせるためにLong型に変換しています)
        mIdealwait = ((ONESEC shl 16) / mMaxfps).toLong()
        //初期化の時点の時間を保存
        mOldtime = (System.currentTimeMillis() shl 16)
     }

次に実際にウェイトをかける処理をProcとしています。

//フレームレート制御処理メソッド
    fun Proc()
    {
        //ループ更新後の現在時間を保存
        mNewtime = (System.currentTimeMillis() shl 16)
        //理想的な時間から1ループにかかった時間と
         //前回の処理で出た誤差を引き実際のウェイト時間の算出
        mWait = mIdealwait - (mNewtime - mOldtime) - mError
        //ウェイト時間が最低でも1ミリ秒になるように補正
        if (mWait < (1 shl 16))mWait = (1 shl 16)
        //ウェイト前の時間を保存
        mWaitOldtime = mNewtime
        //ウェイトをかけます
        Thread.sleep(mWait shr 16)

        //ウェイト後の時間を保存
        mWaitNewtime = (System.currentTimeMillis() shl 16)
        //ウェイト実施後の時間から実施前の時間と
     //実際にかけたウェイト時間を引き
        //誤差を算出しています
        mError = mWaitNewtime - mWaitOldtime - mWait
        //ループ更新前の時間を保持
        mOldtime = mWaitNewtime
    }

kotlinは変数の型を推論してくれるのでjavaと比べて楽に感じました。

宣言時のval(読み取りのみ),var(書き込み可能)で書き分けられるのも良いですね。

参考記事: Javaゲーム制作記ミリ秒のsleepで正確にFPSを固定する方法

水曜担当 Tanaka



アプリ関連ニュース

お問い合わせはこちら

お問い合わせ・ご相談はお電話、またはお問い合わせフォームよりお受け付けいたしております。

tel. 06-6454-8833(平日 10:00~17:00)

お問い合わせフォーム