新人日誌4
- 2019年2月20日
- 他の話題
動画を編集する機会があり、
動画のフレームレートを安定させるための制御を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
tanaka at 2019年02月20日 10:00:19