こんにちわ、Unityエンジニアのオオバです。

Unity SkinnedMeshRendererのクオリティ負荷検証_0

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

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

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

Unity SkinnedMeshRendererのクオリティ負荷検証_1

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

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

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

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

この記事の内容

検証

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

Unity SkinnedMeshRendererのクオリティ負荷検証_2

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

Quality 1Bonesの場合

Unity SkinnedMeshRendererのクオリティ負荷検証_3

Unity SkinnedMeshRendererのクオリティ負荷検証_4

Quality 4Bonesの場合

Unity SkinnedMeshRendererのクオリティ負荷検証_5

Unity SkinnedMeshRendererのクオリティ負荷検証_6

結論

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

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

余談

Unity5.4からSkinnedMeshRendererの設定項目に 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の負荷は軽くなるのだろうと思います。

オススメ記事
検証環境