VRChat用アバターの最適化をしようと調べていると、「パフォーマンスに影響しないようにドローコールを減らそう」という話を見かけたことがあるかもしれません。GPUに対してオブジェクトを描画してくれ~とCPUが要求するやつというざっくりしとした認識しか持っていませんが、これが多いとパフォーマンスが下がってしまうわけです。
巨大なテクスチャや大量のPhysBone、そして煌びやかに発光するライトのが多分大きな影響がありそうな気がしますが、そちらはひとまず置いておくことにします。ドローコールを削減する方法は割愛しますが、具体的にどれぐらいまで減らしてあればいいのかよく分からないので、適当に眺めてみることにしました。
※Unityに関する知識が乏しく、いくらか正確さを欠いていると思います。予めご了承ください。
使用するアバターなど
軽いアバター代表としてシヴィーちゃん(プロトタイプ版)を用意しました。パフォーマンスランクはGoodです。スキンメッシュは1つで、PhysBoneなどの揺れものも一切ないので、相当軽い部類かと思われます。
比較対象として大人気アバターのマヌカちゃんも使用します。パフォーマンスランクはVery Poorです。
また、改変した場合にどうなるかの比較として、マヌカちゃん用に断罪セーラーを使用します。
内訳は端折りますが、普段使っているライムちゃん(色々と改変済み)も使用します。
Unityシーン上には何も設置しません。Skyboxがほったらかしですが、とりあえずDirectional Lightの影だけ切りました。最適化ユーティリティとしてAAO: Avatar Optimizerも使用します。
比較してみる
デフォルトの状態を確認する
シヴィーちゃんを設置してプレイモードにしてみました。BatchesとSetPass callsは7です。PC版のマテリアル数は5つでQuest版は1つとなりますので、Quest版だと1回で済むのかなと。
次にデフォルトのマヌカちゃんを確認してみます。Batchesが43でSetPass callsは11となりました。マテリアル数は同じく5つですが、スキンメッシュが22もあるのでドローコールの差が出ています。
AAOのTrace And Optimizeを試してみる
VRChat用アバターのドローコールなどを減らす手っ取り早い手段として、AAOのTrace And Optimizeを使用する方法があります。スキンメッシュが減ればBatchesの回数も減り、マテリアルが減ればSetPass callsの回数も減って描画負荷が小さくなるはずです。(多分……。)
AAOのTrace And Optimizeによる自動最適化でスキンメッシュが2つぐらい減ったので、Batchesは43から39に減らせました。ちなみに手動で大胆に1メッシュに結合すると、Batchesが11に減ります。
改変するとどうなる?断罪セーラーを着せてみる
リッチ(?)な衣装ということで、マヌカちゃんをEXTENSION CLOTHINGの断罪セーラーに着せ替えてみました。11万ポリゴンだったマヌカちゃんが20万ポリゴンになり、スキンメッシュの数が27まで増えています。ドローコールはというと、Batches 71のSetPass calls 25に爆増しています。
この状態でAAOを使うといくらかスキンメッシュが結合されて、Batchesが71から37に減りました。SetPass callsの方はマテリアル数が増えてるのが影響してそうですね。
さて、グラフにして眺めてみると10回ぐらいまで減らすのはだるそうですが、20~30の範囲内であれば大丈夫そうかなぁという感じがします。
普段使ってる改変済みアバターと比べてみる
VRChatのパフォーマンスランク「Medium~Poor」ぐらいになるようにした改変済みライムちゃんも含めて比較してみます。フレームタイム順に並び替えてみましたが、マニュアルベイクせずに比べたので裏で色々動いてたりと色々条件が違うのであんまりあてにはならないです。(ポリゴン数やテクスチャ、PhysBoneなどの差もあるしね。)
こうしてみると、20回ぐらいに抑えてあればまぁまぁなんじゃないかと思いました。(※デフォルトで置いてあるDirectional Lightの影をオフにした状態の比較です。)
少なくとも何も最適化せずに70とか行くのは避けたいですね。やる気と根気があれば、大人数の集会用にシヴィーちゃん並に軽いアバターを目指してみると助かる人が居るかもしれません。
無理のない範囲として、20~30回ぐらいならよさそう?
数人のフレンドと会うぐらいであれば、20~30回程度にしておくとそれなりに減らせている部類に入るのかなと思います。パフォーマンスランクを下げようとすれば自然とこのぐらいになりそうな気もしますが、参考程度にお願いします。
今回はPhysBoneのことを一切考慮していませんので、しっかりと軽量化するならそちらも気をつけなければいけません。Very Poorを脱却しようと思うとポリゴン数やPhysBoneが真っ先に引っ掛かるのですが、スキンメッシュやマテリアルの数も気に掛けておきたいですね。
ちなみに、Vketの入稿ルールでは1スペースの上限として、SetPass calls 20のBatches 30までとなってました。