渋谷ほととぎす通信

完全趣味でやってるUnityメモ。説明できないところを説明できるようにするための個人ブログ。昨日の自分より少しでも大きくなれるように。。。 ※所属団体とは一切関係がありません

Unity スキンメッシュレンダラーのクオリティ負荷検証


環境

  • Unity5.4.2f1

f:id:esakun:20161203191404p:plain

スキンメッシュレンダラーはボーンアニメーションを使用する時に必要となるRendererです。
その中にQualityという設定項目があり、各頂点が最大いくつのボーンから影響を受けるのかを設定できます。

実際に数値を変更するとわかりますが、低くするとモノによってはアニメーション中のにテクスチャが伸びてしまって、不格好な見た目になることもあります。

成果物のクオリティに関わる部分なので、適切な数値を選びたいところです。

f:id:esakun:20161203192715p:plain

このようにAutoを除くと1, 2, 4のどれかを設定できます。

Unity はスキニング、バッチング、物理計算、ユーザースクリプト、パーティクルについて CPU に依存します

Unity - マニュアル: プロファイリングより

公式マニュアルにあるようにスキニングはCPUに依存するためQualityの数値が高いほどCPUの負荷は高くなります。

検証

約2700頂点のキャラを100体登場させてQuality値におけるCPU負荷の変化をUnityEditorで検証してみます。

f:id:esakun:20161203210536p:plain

SkinMeshRendererの負荷を見たいのでUnity ProfilerのCPU Usageを Rendering だけにし、MeshSkinning.Updateの値をウォッチします。

Quality 1Bonesの場合

f:id:esakun:20161203210424p:plain

f:id:esakun:20161203200331g:plain

Quality 4Bonesの場合

f:id:esakun:20161203210457p:plain

f:id:esakun:20161203200042g:plain

結論

3000頂点ほどのローポリモデルではあまり負荷は変わらないので、あまり気にせずに4Bonesにしても問題ないと思われます。

腑に落ちない検証結果でしたので、次は数万頂点のモデルを使用してチェックしようと思います。おそらく頂点の多さがボトルネックになるのではないかと推測しています。

余談

Unity5.4からスキンメッシュレンダラーの設定項目に Skinned Motion Vectorsが追加されています。

If enabled, the Mesh skinning data will be double buffered so that skinned motion can be interpolated and placed into the motion vector Texture. This has a GPU memory overhead, but leads to more correct motion vectors.

GPUのオーバーヘッドにはなるが、有効にするとスキニングデータがダブルバッファされ、モーションベクトルテクスチャを配置でき、より正確なモーションベクトルを得られることが出来るとのこと。

モーションベクトルとは?

画面空間内のあるフレーム間で移動するメッシュやその他の物の量を追跡することが出来るものであるとのこと。

It's mainly used for updated image effects such as temporal antialiasing and motion blur.

Mesh Renderer Motion Vectors | Unity Forumより

要は使用するとスキンメッシュの動きを新しいバッファにレンダリングされ、使用用途としては、一時的なアンチエイリアシングやモーションブラーなどのイメージエフェクトに使われるということらしい。

負荷をテストしていないので何とも言えないが、イメージエフェクトを使用しないのであれば外したほうがGPUの負荷は軽くなるのだろうと思います。

あわせてどうぞ

www.shibuya24.info

www.shibuya24.info

www.shibuya24.info

www.shibuya24.info

www.shibuya24.info