ディスプレイのリフレッシュレートの設定
ディスプレイリフレッシュレートは、ヘッドセットの画面が1秒間に更新される回数を表します。リフレッシュレートが高くなると、フレームレートが高くなるため、アウトプットがより鮮明になり、彩度が向上します。ただし、リフレッシュレートが高いほど、アプリにはより短い時間で処理を実行することが求められます。
アプリのデフォルトのディスプレイリフレッシュレートは72 Hzです。それ以外のリフレッシュレートでアプリを実行したい場合は、アプリがそのレートを維持するのに十分なパフォーマンスで動作するようにする必要があります。目的のディスプレイリフレッシュレートで一貫したレンダリングができないアプリは、Meta Horizonストアの審査で不合格になります。そのようなアプリでは、ジャダー(映像のカクつき)や周辺部のちらつく黒い領域、その他のパフォーマンスに関連する問題を引き起こす可能性があります。
デバイスでサポートされているリフレッシュレートを取得する
ヘッドセットモデルによっては、ほかよりも高いディスプレイリフレッシュレートを設定できるものもあります。現在設定可能なリフレッシュレートを以下の表に示しますが、常に目的のリフレッシュレートがユーザーのデバイスで有効であることをプログラムで確認してから、リフレッシュレートを設定するようにしてください。
デバイスモデル | 60 Hz | 72 Hz | 80 Hz | 90 Hz | 120 Hz |
---|
Quest | メディア アプリのみ | ✓ | - | - | - |
Quest 2 | メディア アプリのみ | ✓ | ✓ | ✓ | ✓ |
Quest Pro | - | ✓ | ✓ | ✓ | - |
Quest 3 | - | ✓ | ✓ | ✓ | ✓ |
Quest 3S | - | ✓ | ✓ | ✓ | ✓ |
60 Hzはメディアプレイヤーアプリでのみ使用できます。60 Hzは、30 FPSまたは60 FPSの動画をディスプレイリフレッシュレートと同期させて滑らかに再生する方法として提供されています。なお、メディアアプリではさらに高いリフレッシュレートを使用できます。ただし、リフレッシュレートがデバイスでサポートされていて、アプリのパフォーマンスが維持される範囲に限ります。メディアプレイヤー以外のアプリでディスプレイリフレッシュレートを60 Hzに設定すると、ストアの審査で不合格になります。
ヘッドセットの現在のリフレッシュレートを確認する方法
使用しているヘッドセットの現在のリフレッシュレートは、以下の手順でリアルタイムで確認できます。
- Meta Horizonモバイルアプリで開発者モードを有効にします。手順については、開発者モードを有効にするをご覧ください。
- Meta Quest開発者ハブのデスクトップで以下の操作を行います。
- OVR Metricsツールをインストールします。手順については、Meta Horizonストアをご覧ください。
- 設定の歯車アイコンを選択し、フレームレートを表示するようにMeta Quest開発者ハブのMetrics Performance HUD Settings (指標パフォーマンスHUD設定)を設定した後、Average FPS (平均FPS)の2つのボックスにチェックを入れます。
デバイスでサポートされているリフレッシュレートのリストを取得する方法
OVRPlugin.systemDisplayFrequenciesAvailableを呼び出して、利用可能なディスプレイ頻度の配列を取得します。
以下はその例です。
float[] freqs = OVRManager.display.displayFrequenciesAvailable;
アプリで72 Hz以外のリフレッシュレートを設定したい場合は、Androidマニフェストのサポート対象のデバイスのセクションに、このレートをサポートするデバイスを含める必要があります。Unity向けのMeta Quest統合は、Quest 2サポートの<meta-data android:name="com.oculus.supportedDevices" android:value="quest|quest2"/>
をAndroidマニフェストファイルに自動的に追加します。ただし、カスタムのマニフェストファイルを使用している場合は、自分で確認する必要があります。
リフレッシュレートの設定方法
希望するリフレッシュレートを指定してOVRPlugin.systemDisplayFrequencyを呼び出します。
以下はその例です。
OVRPlugin.systemDisplayFrequency = 90.0f;
72 Hzより高いディスプレイリフレッシュレートが設定されたアプリで過熱イベントが発生すると、動的スロットリングの最初のステップとして、リフレッシュレートが72 Hzに下がることがあります。過熱状況が悪化すると、動的スロットリングの追加のステップが実行され、リフレッシュレートを維持しつつフレームレートが変更されることがあります(minVsyncs=2
に相当)。
動的スロットリングによってリフレッシュレートが低下していることをアプリが認識して、何らかの方法で応答できるようにする場合は、OVRManager.DisplayRefreshRateChangedイベントを関数署名Func(float fromRefreshRate, float ToRefreshRate)
を使って登録します。
OVRPlugin.systemDisplayFrequency = 90.0f;
OVRManager.DisplayRefreshRateChanged += DisplayRefreshRateChanged
private void DisplayRefreshRateChanged (float fromRefreshRate, float ToRefreshRate)
{
// Handle display refresh rate changes
Debug.Log(string.Format("Refresh rate changed from {0} to {1}", fromRefreshRate, ToRefreshRate));
}
アプリが動的スロットリングを処理する方法をテストする より高いディスプレイリフレッシュレートにおける動的スロットリングをシミュレートできます。アプリの実行中に、adbシェルのアクティビティマネージャを使用して、インテントをブロードキャストします。例えば、次のコマンドは10秒間のスロットリングをシミュレートします。
adb shell am broadcast -a com.oculus.vrruntimeservice.COMPOSITOR_SIMULATE_THERMAL --es subsystem refresh --ei seconds_throttled 10
目に見える変化がアプリに見られない場合は、xrGetDisplayRefreshRateFB
関数を使ってリフレッシュレートの変更を確認できます。