VRChat ワールド軽量化のための設定+オクルージョンカリングについて
こんにちは!Klueleです。
ワールドを作成していると予想以上に動作が重くなってしまうことがあります。この記事では動作を軽くするためにチェックするポイントをまとめていきます。
目次
1.Qualityの設定について
2.カメラの設定について
3.static batchingとGPU instancingについて
4.オクルージョンカリング、OccluderとOccludeeについて
5.Occlusion AreaとOcclusion Portalについて
それでは、簡単ですが説明していきます。
1.Qualityの設定について
(2019/10/26追記:Quality設定はunity上での描画のみ反映され、VRChatの動作には影響のないことが確認されました。この内容は誤りでしたので訂正させていただきます。大変申し訳ありませんでした。)
メニューバーのEdit > Project Settings > Quality を開きます。
デフォルトではPC向けの設定値は「Ultra」になっています。重い場合はこの設定値を「Very High」に変更したりして調整します。影の付き方や遠くのオブジェクトが簡易的に描かれるようになり、大雑把にワールドの重さが変わります。
2.カメラの設定について
Clipping PlanesのFarの値をデフォルトの1000から200程度に変更します。遠くのオブジェクトが描画されなくなります。
また、使っているギミックによっては、Culling MaskのレイヤーをEverythingから一部消すと改善されることがあります。(何かのギミックを見せなくするためにあえて消す、という使い方のほうが多い気がします)
3.static batchingとGPU instancingについて
static batchingとGPU instancingは、複数のオブジェクトをまとめて描画する方法です。static batchingは主にCPU、GPU instancingはGPUを使ってまとめて描画処理を行い、高速に描画ができます。
ワールドによって、fpsが下がってしまう要因がCPU側の処理、またはGPU側の処理が重いの違いがあるので、余裕がある方式で描画がまとめたくなるところですが、基本的には「動かないオブジェクトはstatic batching、動くオブジェクトはGPU instancing」で描画をまとめるのがいいようです。
static batchingを使うオブジェクトには、
・Batching Static のチェックをつける
・マテリアルのEnable GPU instancingのチェックを外す
(下図はwater pool parkのイルカの例です)
逆にGPU instancingを使うオブジェクトには、
・Batching Static のチェックを外す(Staticのチェックを外す)
・マテリアルのEnable GPU instancingのチェックをつける
(下図はwater pool parkにあるエビフライの例です)
4.オクルージョンカリング、OccluderとOccludeeについて
オクルージョンカリングは、手前のオブジェクトに隠れて見えないオブジェクトの描画をしないことで負荷を軽減する処理です。この処理をするために、動かないオブジェクトにはとりあえずstatic設定を入れている人はけっこういると思います。
忘れずに、メニューバーのWindow > Occlusion Culling > BakeのタブでBakeをしてください。(私はこのBakeする処理を最近まで知りませんでした・・)
Bakeのパラメータは、Smallest Occluderが1程度が良さそうです。
最も小さい壁のオブジェクトの大きさより、若干小さい値にします。
広くてあまり遮蔽物がないワールドの場合はデフォルトの5から小さくしてもあまり効果がありません。また、Quest用ワールドの場合はオクルージョンカリングの処理もFPS低下の原因になったり、Bakeされたデータサイズも無視できないため、小さくしすぎないよう注意する必要があります。
動かないオブジェクトの全てにstatic設定を入れると、Occlusion data sizeが無視できない大きさになることがあります。また、オクルージョンカリングの処理でなんとなく負荷が高くなることがあります。
その時は、下の分類を目安にOccluder Static設定とOccludee Static設定を見直しして、Occluder Staticをつけるオブジェクトを減らすようにしてください。Occluder StaticとOccludee Staticはどちらか片方だけついていればよいですが、迷ったときは両方付けたままで構いません。
Occluder Static = 1m以上の壁になるオブジェクト
Occludee Static = 遮られて描画を省略するオブジェクト、透明なオブジェクト、Shadow Onlyなオブジェクト、Planeなど片面描写のオブジェクト
Occluder Staticのオブジェクトの例。water Pool Parkでは描画負荷の高いプールの水や周囲の海が地下にあるので、植え込みより深い場所にもOccluderが配置されています。
コクリコさんのこのツイートがOccluder、Occludeeの違いをうまく説明していて分かりやすいです。
5.Occlusion AreaとOcclusion Portalについて
オクルージョンカリングのBakeをすると、ワールド全体に細かくBakeされることがあります。細かくBakeしたいエリアを指定するのがOcclusion Areaです。
空のオブジェクトにOcclusion Areaのコンポーネントを追加して、細かくBakeしたいエリアを指定します。複数のオブジェクトを使ってエリアを指定することもできます。
(下図1番目がOcclusion Areaの配置例、2番目が2個のOcclusion Areaを配置してBakeした結果)
オクルージョンカリングは便利な機能ですが、少し離れると解像度が粗くなるためかOccluderが無視されたりします。そのため、アバターが少し離れたときだけ大きなOccluderを配置する必要があります。
BakeしたOccluderは通常は固定ですが、Occluder Portalを使うとOccluderを出したり消したりできます。Occluder Portalは空のオブジェクトに追加し、Openのチェックを消すとOccluderとして機能します。
(下図はOcclusion Portalを追加したオブジェクトの例。見えるようにPlaneをつけていますがPlaneなどのmeshを付けなくても機能します)
Occluder Portalが付いたオブジェクトをLocalなVRC_TriggerでEnable/Disableしたり、AnimationでEnable/Disableしたりして、見た目に影響のない範囲でオクルージョンカリングを使うようにします。
なお、カメラのClipping Planeの1/3の距離(上の設定の場合66.7m)以上離れるとOccluderがほぼ機能しなくなるため、それ以上遠いオブジェクトの描画を省略する場合はLODでCullingするか、LocalトリガーでオブジェクトのMesh RendererをDisableにする等の対処が必要です。
オクルージョンカリングは近距離~中距離くらいの描画を省略するために使うことを覚えておく必要があります。遠距離ではLODのCulling、さらに遠くではカメラのClipping Planeの調整が重要になります。
また、Occuluderがアバターを遮ると描画を省略することができます。ただし、アバターのBoundsを完全に覆うような大きなOcculuderが必要になるので大きな効果を出すのはかなり難しいです。
ここまでで、ワールド軽量化のための設定の一部を説明しました。それでは、楽しいVRChatライフを!