固定フレームレートのトラップ
Unityでゲームビューを30fpsでPNG連番キャプチャする処理を書いたときにひっかかったことをメモっておきます。30fpsなので、Application.targetFrameRate=30にしていたのですが、キャプチャ後の連番動画を再生したところ、どうも早回ししているようなおかしい動画ができあがってしまいました。
原因
原因は、Unityの中での処理落ちのときの処理です。
Unityは処理落ちした場合は、ゲーム内での時間経過がゆっくりになるわけではなく、ゲーム内での経過時間と現実の経過時間をあわせるようです。
どういうことかというと、イメージとしてたとえば、1f目の処理に2f分時間がかかってしまったとします。そのときに、次に描画する予定の2f目をとばして、3f目を描画するということです。律儀に1枚1枚レンダリングすると0.5倍スローなゲームになってしまいますから。
というわけで、今回のようなキャプチャ処理の場合、30fpsなど守りきれるわけなく、フレームが飛ばし飛ばしでキャプチャされます。それを30fpsとして再生すると当然、早回し再生になるということだったようです。
対策
「こんなこともあろうかと」
といわんばかりに、ちゃんとUnity先生はそういった毎フレーム必ず処理してほしいときの関数を用意してくれていました。
Time.captureFramerate
そのまんまです。
Application.targetFrameRate=30;
Time.captureFramerate=30;
と設定してあげることで、30fpsで間違いなくキャプチャされるようになりました。
毎フレーム必ずやる処理とか、キャプチャ以外にも使えると思います。
公式リファレンスの下のほうに「キャプチャフレームレート」ってちゃんと書いてあります。さすがUnity先生・・・。
では、本日はこのあたりで。