読者です 読者をやめる 読者になる 読者になる

Unity使用中に学んだパフォーマンスチューニング方法(1):LOD

せっかくなので、Tempulusを作ったときのパフォーマンスチューニング方法を記録しておこうと思います。

実はTempulusは最初にざっと作ったときは、FPSが40未満でした。

主な原因は、今回使った街のアセット、Detailed City Pack です。

これは街全体のアセットが含まれているので、色々と使い道がありそうなのですが、どういうわけか、サンプルシーンにOVRPlayerContrllerを配置してOculusで見ると、PCのファンがけっこうな速度で回転することになります。

最初は理由がわからなかったのですが、調べていくうちにいくつか原因がわかってきたので、それらを取り除くことである程度のFPSを稼ぐことができました。

対策実施前

f:id:Takyu:20140702184511p:plain

最終的な対策実施後

f:id:Takyu:20140702184720p:plain

実際は表現を多少犠牲にしているところもあるのですが、せっかくなので紹介していきたいと思います。

いくつかありますが、今回はLODです。


LODとは?

●Level Of Detailの略

●カメラがオブジェクトからどれだけ離れているかによって、高解像度版と低解像度版のメッシュが切り替わる
->描画パフォーマンスの向上

たとえば、下記の例では、LOD2(距離遠い)向けメッシュが用意されていないのか、カメラを遠ざけるとビルが消えました。

f:id:Takyu:20140709083438p:plain

f:id:Takyu:20140709083645p:plain

LOD2(距離遠い)、と書かれたときは建物が消えていますが、LOD0(距離近い)のときは建物が確認できます。

このように、カメラと対象物の距離によってメッシュを切り替えるのがLODです。


また、画像右側のInspector にてLOD0〜2のバーが表示されています。

このバーは、カメラと対象物の距離を相対的に表しており、カメラアイコンは対象からの距離が遠いほど右に移動します。

Inspector上ではバーの長さを変更することができます。

たとえば、図1の場合、カメラと対象物の距離がバーの半分近くになるまでLOD0が適用されますが、

f:id:Takyu:20140709165308p:plain

図1

図2の場合、カメラと対象物の距離がバーの半分を超えたらほぼCulled(何も表示しない?)が適用されます。

f:id:Takyu:20140709165332p:plain

図2


メッシュが高解像度であるか低解像度かで、レンダリングにかかる負荷が変わるので、LODを駆使することでFPSを稼ぐことができそうです。


今回の開発では、Inspectorのバーで、ほとんどが長距離でもLOD0に設定されていたので、LOD1または2に変更しました。


LODに関する詳細説明は以下を参照ください。
http://docs-jp.unity3d.com/Documentation/Components/class-LODGroup.html

(注意)
私自身、LODについて理解が浅いので間違っている可能性があります。


次の記事ではShaderについて解説予定です。