(:3[kanのメモ帳]

個人ゲーム開発者kan.kikuchiのメモ的技術ブログ。月木更新でUnity関連がメイン。

(:3[kanのメモ帳]


本ブログの運営者kan.kikuchiが個人で開発したゲームです!超可愛い実写猫の戦略的オンラインカードゲーム!PC&スマホ両対応!

Download on the App Store Google Play で手に入れよう

手軽にOculus Go用アプリの負荷を削減したり、見栄えを良くしたりする方法【Unity】【VR】【Oculus Go】 【Unite 2018 Tokyo】


このエントリーをはてなブックマークに追加


この記事でのバージョン
Unity 2017.4.5f1


はじめに

今回はUnityでOculus Go向けアプリを開発している際に

ちょっとした設定で手軽に負荷を削減したり、見栄えをよくしたりする方法のご紹介です!

なお、GearVRなどのOculusGo以外でも使えるものもあります。


また、本記事は『Unite 2018 Tokyo』

「Oculusで作るスタンドアローン・モバイルVRコンテンツ」

を参考にさせてもらってます。

【講演者】
井口 健治(Partner Engineering Specialist|Oculus)

【こんな人におすすめ】
・VR開発に対する興味のある方
・既にVRゲーム・コンテンツ開発を行われている方
・これからVRゲーム・コンテンツ開発をはじめたい方、興味をお持ちの方

【受講者が得られる知見】
・Oculus GoやSanta Cruzのコンテンツ開発のテクニック
・Oculusプラットフォームの現状、参入のノウハウ



シングルパスステレオレンダリング

まずは負荷を削減する方法からです。

なんと、Stereo Rendering MethodをSingle Passに変更するだけ。


f:id:kan_kikuchi:20180728061804j:plain


Stereo Rendering MethodをSingle Passに変更すると

シングルパスステレオレンダリングを有効に出来ます。

そして、そのシングルパスステレオレンダリングとは以下のようなもの。

左右の目の画像を同時に 1 つのまとまったレンダーテクスチャにレンダリングします。つまり、シーン全体が 1 回だけレンダリングされ、CPU 処理時間が大幅に短縮されます。この機能がないと、Unity は、最初は左目画像を次に右目画像をというように、シーンを 2 回レンダリングします。


ようは、両目の画像を同時に描画して軽くするという手法です。


ただし、シングルパスステレオレンダリングに対応するために

シェーダーの修正やポストエフェクトの調整が必要になる場合があります。

なお、その修正や調整の方法は上記のドキュメントに載っています。


固定中心窩レンダリング (Fixed Foveated Rendering)

次も負荷を削減する方法で、その名も固定中心窩レンダリング (Fixed Foveated Rendering)

名前は難しそうですが、「画面の端の解像度を下げて負荷削減しよう!端ならバレないでしょ!」

みたいな感じの手法です。


f:id:kan_kikuchi:20180726121634j:plain
f:id:kan_kikuchi:20180726121644j:plain


実装方法も以下のプログラムを1行足すだけ。

種類はLow, Medium, Highの3種類あり、後になるほど端の解像度が下がり、負荷が減ります。

//OVRManager.TiledMultiResLevelには他にもOff, LMSLow, LMSMediumがある
OVRManager.tiledMultiResLevel = OVRManager.TiledMultiResLevel.LMSHigh;

f:id:kan_kikuchi:20180728104407j:plain
f:id:kan_kikuchi:20180728104414j:plain
f:id:kan_kikuchi:20180728104421j:plain
f:id:kan_kikuchi:20180728104429j:plain


なお、実行中に変更する事も出来るので「ここは端が気になるから無効にする」なんて事も可能です。


アイバッファ解像度

今度は見栄えを良くする方法です。

Oculus GoやGearVRは1280×1440の解像度なのですが、

デフォルトでは1024×1024で表示されており、ちょっと足りてません。

なので、アイバッファ解像度を1.25倍(1280×1280)にする事でより綺麗に見えるようになります。

//Unity2017.2以上
UnityEngine.XR.XRSettings.eyeTextureResolutionScale = 1.25f;

//Unity2017.2未満
UnityEngine.VR.VRSettings.renderScale = 1.25f;


かなり綺麗になりますが、負荷は上がるので無理をして使う必要はありません。


リフレッシュレート

これも見栄えを良くする方法で、リフレッシュレートを上げるというものです。

変更方法は以下のコード1行のみ。ちなみにOculus Goは72Hzまで対応しています。(デフォルトでは60Hz)

//リフレッシュレートを72Hzに変更
OVRManager.display.displayFrequency = 72.0f;


これでより明るく、滑らかに、そしてチラツキを少なくできます。


ただし、アイバッファ解像度と同様に負荷は増しますし、

動画再生をする時は、画面のリフレッシュレートを

動画のFPSの整数倍にした方がカクつきが少なくなるので注意が必要です。