(obsolete) Oculus Rift + Unity におけるフレームレートの制御

この記事は Oculus SDK v0.2, Unity v4.2 に基づいています。
また下記の「追記 (2014/03/25)」にも書きましたが、Oculus Rift は 60 fps の状態で使うのが基本です。60 fps 未満ではその真価は発揮されません。

※追記 (2014/04/21)
アクセス解析を見る限りこの記事を見てくれている人が少なからずいるようなので、今一度強調しておきますが、Oculus Rift は 60 fps の状態で使うのが大原則です。以下の記事は個人的な備忘録として残してはおきますが、決して真似せず、ハイエンドなマシンを買って 60 fpsOculus Rift を愉しんで下さい。60 fps 未満で Oculus Rift を愉しむのはルール違反 (?) らしいです。以下の記事は 60 fps で動作する Oculus Rift の素晴らしさを知らなかった頃に書いた記事なので、あくまでそのつもりで読んで下さい。

※追記 (2014/10/29)
アクセス解析を見る限りいまでもこの記事を見てくれている人がいるようなので、一応追記しておきますが、当時は「DK1」を使っていたため 60 fps が上限でしたが、現在は 75 fps まで実現できる「DK2」が主流となってきています。「DK2」を持っている人は 75 fps で楽しんでください。

※追記 (2015/07/20)
この記事にたどり着いた人はぜひ以下のドキュメントを読んでください。
Oculus Best Practices
記事からフレームレートに関する部分を引用します:

Ideally, target 20ms or less motion-to-photon latency (measurable with the Rift’s built-in latency tester). Organise your code to minimize the time from sensor fusion (reading the Rift sensors) to rendering.

このように、レイテンシが 20ms (= 50 fps) よりも遅くなったら良くないということが Oculus Rift の公式ドキュメントにも明示されています。フレームレートは VR 体験に非常に大きく影響します。Oculus Rift はぜひ 75 fps で楽しみましょう。

Oculus Rift

世にも親切な方が Oculus Rift を無償で貸して下さっている(!)ので、最近は Oculus Rift を弄ったりしています。

Oculus - Oculus VR

Oculus Rift とは Kickstarter 発のヘッドマウントディスプレイ (HMD) で、安価で視野角が広いことが特徴です。Oculus Rift を利用したアプリケーションは Unity で開発可能*1です。

VSync (垂直同期)

Oculus Rift + Unity ではデフォルトの状態では VSync (垂直同期) が有効になっており、フレームレートが自動的に 60 fps (frames per second) 前後、あるいは 30 fps 前後になるようになっているようです*2

通常の Unity のプロジェクトであれば Project Settings > Quality > VSync Count の値を弄ることで垂直同期を on/off にし、計算性能的に可能な範囲ならば任意のフレームレートを実現できます。しかし Oculus Rift + Unity の環境では、OVRCameraController.cs 内の

public void SetMaximumVisualQuality()
   {
      QualitySettings.softVegetation = true;
      QualitySettings.maxQueuedFrames = 0;
      QualitySettings.anisotropicFiltering = AnisotropicFiltering.ForceEnable;
      QualitySettings.vSyncCount = 1;
   }

の部分で VSync Count = "Every VBlank" に上書き設定されてしまうため、例えば垂直同期を off ("Don't Sync") にするには

public void SetMaximumVisualQuality()
   {
      QualitySettings.softVegetation = true;
      QualitySettings.maxQueuedFrames = 0;
      QualitySettings.anisotropicFiltering = AnisotropicFiltering.ForceEnable;
      QualitySettings.vSyncCount = 0;
   }

のように変更する必要があるようです。

参考:Frame Rate | Unity Integration | Oculus VR Forums

メリット・デメリット

垂直同期を off にすることによって 30 fps しか出なかったものが 40-50 fps 出るようになったりすることがある反面、画面のちらつきが発生することがある*3ため、そこはトレードオフといったことになると思います。

個人的には 30 fps でちらつきがないものより、40-50 fps でちらつきがあるものの方が没入感が高い印象を持ちました。

一般向けにゲームを公開する場合ではなく、限られた計算資源の中で展示等をする場合には役立つかもしれません。

追記 (2013/10/07)

VSync の設定に限らず、OVR... 系の inspector に表示される内容の多くはアプリケーション起動時に設定を上書きされてしまうようです。色々カスタマイズするには結局 OVR... .cs の内容を読んで自分でソースコードを書き換える必要がありそうです。

追記 (2013/10/21)

VSync に関連して、以下のような興味深い発表が NVIDIA からありました。この記事に VSync on/off のメリットデメリットがよくまとまっています。

NVIDIA,Vsync有効でも無効でもない第3のディスプレイ同期技術「G-SYNC」発表。その正体と狙いを明らかにする - 4Gamer.net

NVIDIA の発表では GSync という新しい技術が紹介されたようです。GSync とは一言で言えばディスプレイ側に細工を仕込むことでリフレッシュレートの動的変更を可能にしてしまう技術のようです。

Oculus Rift を用いたコンテンツを作る際には、近い将来、この GSync という技術が非常に重要になってきそうな予感がします。

追記 (2014/03/25)

今更ながら念のため強調しておきますが、Oculus Rift は必ず 60 fps の状態で使って下さい。この記事は「どうしても貧弱なマシンでデモを展示しなくてはならない」ということがあったために書きましたが、基本的には 60 fps 出して初めて Oculus Rift の実力が発揮できるということは念頭においておいて下さい。

*1:ただし Pro ライセンスが必要です。Oculus Rift Developer Kit を購入すると3ヶ月の体験期間を与えられるそうです。

*2:実はこのあたりの仕組みはよく理解していないのですが...。もし誤りがあればお知らせ下さい。

*3:ちなみに MacBook Air の画面上では強くちらつきましたが、Oculus Rift を通してみた視界ではそれほど気になりませんでした。