Let's Enjoy Unreal Engine

Unreal Engineを使って遊んでみましょう

UE4 Instanced Static MeshとHierarchical Instanced Static Meshの違い

よくInstanced Static Mesh(以下ISM)とHierarchical Instanced Static Mesh(以下HISM)の違いがわからなくなるので、ここでまとめておこうと思います。

そもそも一般的にInstanced Static Meshというのは1つのメッシュをインスタンシング描画することで、Draw Callを最低限の回数行うことでCPU負荷を最小限に抑えることができる機能です。数を沢山出したいメッシュを利用する際には非常に便利なものです。

以下のような記事が詳しいので詳しくはそちらで。
qiita.com

ではここにISMとは別にHISMと呼ばれるものがUE4にはあります。これHierarchical(階層付き)ということはISMが何かしら構造を持っているということなのですが、なんのことかよくわかりません。

なのでちょっとだけ検証してみました。

一番大きな違い

一番大きな違いですが、英語のAnswerHubに非常に詳しいスレッドがあります。

Difference between Instanced Static Mesh Component and Hierarchical Instanced Static Mesh Component

読んでいくと『ISMは全てのインスタンスで同じLODを表示する必要があるため、LODを持つものには不向きです。しかしHISMは階層を持つので、インスタンス毎に個別のLODを表示できるので、フォリッジ(葉)に最適です』というようなことが書かれています。

つまりLODを持てるか持てないかという部分で一番の差があります。両方ともカリングは可能なので見えなくなった場合には描画されません。

ここで軽く実験をしてみましょう。

ISMとHISMのカリングの違い

スタティックメッシュのLODを追加し、どのようにカリングされるのかを実験します。今回はどこにでもあるイスのスタティックメッシュにLODを4段階ほど追加しました。

f:id:alwei:20190609201649p:plain

そして複数個のイスを配置します。右側がISMで左側がHISMです。

f:id:alwei:20190609201817p:plain

コンソールコマンド、"FreezeRendering"で描画をフリーズしてカリングが行われているかをチェックします。今回はマウス左ボタンを押すたびに切り替えてます。

f:id:alwei:20190609201920p:plain

まずは画面から全て見えない状態にしてみる。これは当然ながら全てカリングされました。

f:id:alwei:20190609202016p:plain

次に画面にそれぞれ半分ずつ写った状態でカリングしてみます。今度はHISMが半分だけカリングされました。

f:id:alwei:20190609202512p:plain

これはLODの段階の単位でカリングされており、画面に写っていない状態だと必然的にLODの段階が変化するのでカリングされていることになります。なるほど、これはHISMの方がよさげ?

まとめ

ISMとHISMを比較してみましたが、まとめると以下のような具合になります。

・ISMはLODを持つことができず、Draw Callは全インスタンスで1回
・HISMはLODを持つことができるが、Draw CallはLODのインスタンス毎で複数回
・ISMは全てのインスタンスバウンディング外であればカリングされる
・HISMはLODのインスタンス毎でバウンディング外であればカリングされる
・ISMはカリングのCPUコストが僅かに安いがカリング自体はされにくい
・HISMはカリングのCPUコストが少し高くつくがLODがあればあるほどカリングされやすい
・HISMがどの程度カリングされているかはコンソールコマンド"stat foliage"で確認可能

つまるところ、LODを持つ場合はHISMの方が有利と言えます。ただし、Draw Call回数はISMの方が当然ながら低くなりますので、使い分けとしては比較的少数で複数個並べる小物(宝箱とか樽とか)にはISMで、大規模に大量に並べるようなもの(草や木々)にはHISMが向いているかもしれません。

ちなみにUE4標準のフォリッジシステムは最初からHISMを使ってレンダリングしていることも覚えておくといいでしょう。