こんにちはっ🌟八ツ橋まろんです
Unityを使ってちょっとした実験をします。
題して『Unityで大量のキャラクターをアニメーションさせると何体出せるのか?』
以下は、キャラクターを10体アニメーションさせた例です。
CPU: Core-i7 14700F
GPU: RTX4070 SUPER
10体程度では、320FPSと非常に高速に動いています。さすがハイエンドPC✨
次は100体です。78FPSまで下がってきました。
500体です。20FPS。このあたりが限界のようですね。
よくみると、Batchesが31895、Shadow castersが12400となっています。
・Batchesは描画処理の回数なので、1メッシュで1マテリアルのキャラクターにすれば軽量化できそうです。
・Shadow castersは影の描画なので、シャドウ無しにすれば軽量化できますね。
500体を1メッシュ1マテリアル、シャドウ無しでアニメーションしました。90FPSまで回復しています。
3000体を描画&アニメーションしています。18FPSです。
先ほどの20FPSと比べて、Batchesは6000程度、Shadow castersは0なのでかなり軽い状態なのですが、FPSが低いですね。
Skinned Mesh(ボーン変形できるメッシュ)が3000で、有効なAnimatorが3000なので、これらがFPS低下の原因のようです。
3000体をTポーズ状態(アニメーション無し)で並べても、22FPSであまり改善しません。
どうやら、Skinned Mesh(ボーン変形できるメッシュ)がボトルネックになっているようです。
Skinned Meshは、ボーン変形で頂点の位置が変わるので、頂点の位置を毎フレーム計算する必要があります(スキニングという)。これを3000体分計算するので重くなります。
以下のProfilerの内容を見ても、3000体のスキニングでGPUが50ms(= 20FPS)かかっていて、これがFPS低下の主な原因だとわかります。
このスキニングは、頂点の数を減らすと多少マシになります。
先ほど8000ポリゴンの身体を3000体スキニングして22FPSでしたが、
800ポリゴンにすると50FPSになりました(画像無し)
ただ、ここから5000体、10000体とキャラクターを増やすことはできなさそうです。
ということで、
『Unityで大量のキャラクターをアニメーションさせると何体出せるのか?』
➡『ハイエンドPCでは3000体が限界』という実験結果になりました。
、、、と言いたいところですが、これは通常のアプローチで愚直に行った場合の話💡
GPUアニメーション(シェーダーアニメーション)とUnity ECS(Entity Component System)を使うと、大量のキャラクターをアニメーションさせることができます✨
(以下は、約1万体の観客をアニメーションさせて110FPS)
ということで、いずれ紹介するのでお楽しみに!!