Unity素人がonly 4Uさんのドレスを気兼ねなく着れるまで負荷を落としてみた ~Profilerの測定結果を添えて
注意!この記事の内容はVRChatのアップデートにより陳腐化しています。
初めに:巨人の脛を齧る
デザインの美しさや見た目のリアルさから注目を浴びたonly 4Uさんのリアル服。そのポリゴン数や負荷については、色々な方から様々な意見が出ていたのを覚えています。なお、その後改めて出されたVer.2では改善が加えられて軽くなったようです。
さて、そんなonly 4Uさんから記念すべき第1作目が先日出ました。
もともと配布服の頃からデザインが気に入っており、速攻で購入したのですが、”どんなところ”でも気兼ねなく着れる、と言うには少し負荷が気になったため、自分で少しだけ軽量化してみました。
まぁ先人達の知恵に頼るんですけど。
ということで参考にさせて頂いたのが下記のページです。
・【VRC向け】きれいで低負荷なClothを作る為の最低限の前提知識。
・23万ポリという数字自体に囚われるのは良くない――かといって重くないわけでもないという話
・説明書に載ってない本当のClothコンポーネント ~VRChatで使うClothコンポーネント~
他にもUnity公式ドキュメントも参考にしています。
注意点として、上記参考資料はUnity2018時点で書かれたものであり(2019向けに追記されていますが)、かつ私が内容を間違って理解している点が多々あるかと思われるので、ここに書いてあることを鵜呑みにしないでください。参考にしていただく分には構いませんが、責任は取れませんのであしからず。
また、Unity2019.4.31f1の"Editer上"での検証になってます。ぶいちゃ持ってたら全然違うじゃねーか!みたいなこともあるかもしれません(私も良く言う)。
そもそもこの記事は、特段Unityに詳しいわけではない人がちょっと調べて雑に「軽量化をしてみたぜ!」って言ってるだけのものなので、ちゃんとした検証結果が欲しい方はお近くのつよつよな方へGo!
一応、今回のnoteの趣旨はあくまで「負荷を定量的に計測し、ある程度軽量化して他の改変例と比較する」であることを前置きします。元のままでは重すぎる、という話ではありません。
負荷計測の巻:DBって意外と重いね
本題に入っていきます。
まず、負荷の計測にはUnity標準のProfilerを使います。処理に掛かる時間をGUIで表示してくれるやつです。
また、衣装の対応アバターの内、私が持っているのはメリノちゃん(以下メリノ)だけなので、今回はメリノ及びメリノ向けに対応した衣装を測定対象とします。
試しにメリノのデフォルトのプレハブを置いて計測してみるとこんな感じです。なお、今回はProfilerの中でも上部の積み上げ折れ線グラフに着目していきます。
かなり波があるのですが、波の頂点の値を取るとレンダリングに0.40ms、DBに0.77ms程度掛かっていることが分かります。合計で1.17msです。(本当は平均値を取るべきなのですが、面倒だったので今回はスパイクに合わせて計測します)
さて、本題であるノーブルパーティドレスを着せた状態で計測します。条件としては、メリノの顔、髪main+long、体のみにした状態で衣装を着せた状態です。
結果がこちら。
グラフから、レンダリングに0.43ms、DBに0.74ms、そしてClothの処理に3.59ms掛かっていることが分かります(ひときわ大きなスパイクは無視しています)。合計は4.86ms、デフォルトのメリノちゃん4人分です。Clothの負荷が処理時間の大部分を占めていることが分かります。
さて、ではこれの値をどこまで小さくすれば良いのでしょうか。
正直この値の捉え方は人によると思います。そもそもVRChatで想定されるシチュエーションの幅は広く、アバター負荷についての一貫した基準というものは余り存在しません。
今回は私が普段使っている改変済メリノてゃんを基準に考えて、Clothの軽量化により処理時間の合計を普段使いアバタの二倍程度に収めることを目標にしていきたいと思います。ダブルサイズのベットを一人で使う感じですね(?)。
因みに普段使いのメリノチャの負荷はこんな感じです。
計測すると合計3.2ms。デフォルトのメリメリ約2.5人分ですね。よって目標は6.4ms前後に収めることです。
…あれ、収まってる
~完~
ってなると企画倒れ(?)になるので、取り合えずこの普段使いのアバターの負荷に近づけることを目標にします。
因みに、DBだけで2ms程度の負荷が掛かっていることがグラフから分かります。これは無駄に二つの衣装のDBが同時に動いているからなんですが(後で気が付いて最適化しました)、それにしてもDBって結構負荷ありますね(PhysicsBone早く来て)
クロスのバリューをチェンジ:Unity分からん
さて、具体的なCloth軽量化方法ですが、私はBlenderアレルギー持ちでリトポロジーなんて出来ませんし、ハイポリ故の美しさを求めて購入しているのもあるので、必然的にUnityのClothコンポーネントの値を弄りまわすことになります。
まずはSolver Frequencyの値を見ます。これはClothの挙動と負荷にがっつり影響する値です。プレハブの値は320ですが、参考文献から180に設定します。(今回は90FPSをターゲットにするのでその倍数)
するとこんな感じ。
Clothの処理時間が3.59ms→2.64msと結構軽くなりました。
さて、お次はUse Continuous Collisionです。これは突き抜け防止に役立つらしいのですが、これも参考元の通りチェックを外します。
結果は以下の通り。
2.64ms→2.33msとさらに軽くなりました。
この時点で処理時間の合計は3.12ms。普段使いの改変より軽くなりました(元が重いのもありますが)。目標達成です。デフォルトのメリノちゃんと比較しても2.5人分、まぁまぁ許容範囲ではないでしょうか。
注意点として、軽量化と引き換えに若干挙動が変化しました。具体的には、少し凸凹した皺が発生したのと貫通耐性が低下しています。
ただ、この状態でも歩く程度ならほぼ問題はありません。
10/24追記:テクスチャの軽量化に関しては付属のReadmeをご覧ください(丸投げ)。グラフを見ていただければ分かる通り描画負荷はそれほどでもないので余り気にするほどではないと思いますが、テクスチャ容量≒アバター容量なのでテクスチャサイズを小さくすると回線とVRAM負荷が減ります。なお圧縮を上げるのは余りお勧めしません。読み込みの負荷が上がりますし、VRAM負荷は変わらないので。
今回の内容としては、測定方法はあまりよろしくないけど一応対照実験の形にしたつもりです。
自分で計測してみる!という方はこの記事の値を参考にせず、自身の環境で基準となるアバタから計測し直してください。でないと余り意味がありません。なぜならこの記事の値は私の環境での値であり、人によって計測値は異なるからです。
ある環境ではデフォルトのメリノちゃんの処理に1msも掛からない場合もあるでしょうし、別の環境では2ms以上かかる、なんてこともあるでしょう。またClothの負荷はCPUに掛かりますし、レンダリング負荷はGPUに掛かります。つまりCPUが強くGPUが弱い人はClothの有無による違いが比較的小さくなります。その逆もまたしかり。
要するに自分でデフォルトメリノちゃん(他の対応アバタでも可)から測り直してねってことです。
終わりに:なんでこんなの書いたんですか?
~最大級のお気持ちゾーン~
正直に言えば、他人からその服重いって言われたくないから、あんまり重くないと言い張るための証拠作りのためです。
余りこの服を良く思わない人が居ることは事実ですし、その考えはおかしなものではありません。この服は比較的高負荷です。そしてその負荷は他人にも掛かるものですから、この服自体を忌避するという行為には筋が通っています。
私個人としても、負荷に対して無頓着でいるのは褒められることではないと思います。特に、人が多くなるイベントインスタンス等では負荷が高いアバターの使用は控えるべきだと考えます。
最適化すること自体は良いことなのです。
ただし、純粋に自分の理想の姿を見せるだけなら、最適化という工程は踏む必要が無いのです。そして最適化は難しく、特に初心者には困難な作業です。そしてなにより、多くの場合表現とトレードオフとなります。徒らに最適化を他人に押し付ける行為は、他人の表現に制限を掛ける行為に繋がりかねません。
VRChatという、折角の現実での制限を無視したことが出来る場所ですから、なるべく制限は少ないままでいて欲しいなと願っています。
余談1:じゃあ何すか?元のままでは重すぎるって事すか?
元が重すぎる、とはあまり思っていません。他の衣装と比較して重いのは事実ですが、別の衣装でも改変の仕方によっては簡単に負荷が増えますし(複数衣装のDBを全部有効にするとかね!)、改変済みアバターとしては特筆するほどではないと思います(ここの考えは個人差が多々あると思いますが)。
一例として、HMDに45FPSで出力するためには22ms以内に処理時間を抑える必要があります。仮定として、10人のデフォルト衣装着たメリノちゃん程度の負荷のアバタが居る中に今回の衣装をそのまま着てきた人が入ってきたとしても、処理時間の合計は16.8ms。まだ5msほど余裕があります。
勿論、実際にはワールドや通信、アニメーション等アバタ以外の負荷もありますし、何よりPCスペックによって大きく変わってくる話ですが、十人程度のインスタンスで使う分には今回の衣装はそのままでも大きな支障はない、と言えるのではないでしょうか。
10/24追記:一つ注意点として、アバターの読み込み時(ダウンロードが終わった後)に数秒負荷が跳ね上がることがあります。この現象に関しては余り情報が無いのですが、原因としてはテクスチャの解凍負荷、そして個人の主観になりますがClothを用いている衣装で大なり小なり発生しているのでClothだと思われます。
テクスチャの解凍負荷についてはテクスチャの圧縮を止める(デフォルトで圧縮が掛かる設定になっています。またUse Crunch Compressionも負荷原因になります)が解決策ですが、Clothについては解決策は現在不明です。誰かつよつよな人教えて下さい。
余談2:「VRChat向け3Dモデル」のための技術と分業
「VRChat向け3Dモデル」に必要な工程数、そして必要技術ってめっちゃ多くないですか?(唐突な口調崩し)
ざっくりと工程を上げれば、
デザイン→モデリング→リギング→テクスチャ作成→Unity上でシェーダーセットアップ→VRChat向けセットアップ→宣伝、広告→サポート
という流れですが、
これだけの工程を全部一人でやるのには無理があろうと思われます。
一番初めの配布服の事例はこの無理に当たったんじゃないかなと。
じゃあどうすればいいんじゃ!という答えの一つとして工程の分業化が挙げられます。余り具体例が挙げられないのですが、一例として、YOYOGI MORIさんが出していらっしゃる、制作班の方々の紹介記事「YOYOGI MORI Archives」を見て頂ければと思います(推しブランドを宣伝していく)。
最近はSDK3.0対応がアバター作者以外の方によって行われている例が増えてきました。この流れで一つのアバターに多くの方々が関わるようになれば、メイン作者さんの負担軽減にもなりますし、全体的なクオリティの向上に繋がるのではないでしょうか。
余談3:ここまで見て下さっている方へのおまけ
私のPCスペックです。何か期待した方は…ごめんなさい。
本来ならもっと上に書いておくべきことなんですが、初めに書くのを忘れたので最後に置いておきます。
まぁ気にする人なら最後まで読んでくれるであろうという魂胆です。
CPU:Ryzen 5 3600
GPU:RTX3060 多分ブーストで1800Mhzくらい
RAM:32GB 2667MHz
10/24追記:なんか5000文字超えててびっくりしましたが、それ以上に作者さんに真面目に読まれて大変恐縮してます。
この記事は雑です。間違いなく。だって私ですら時間を掛ければもっと良い測定とか検証できるので。今回、自分が行ったことを軽量化と称しているのは最適化というほど複雑なことではないからです。
今回の衣装の設定を見て最適化自体はかなりされていると感じました。特にテクスチャが用途に合わせてサイズを細かく変えているモデルは余り見かけないので、他の衣装と比べて明確に最適化されている点だと思います。
そういった努力と比べれば一日で書いたこの記事は全然大したものではありません。
逆に言えば、Unityにある程度触っている方ならこのくらいの検証は出来るかと思います。既に、この記事を見て自分のアバタの負荷検証を行っている方を見かけました。
デフォルトのメリノちゃんと比較して2.5人分、というアバタを日常で使うかどうかの判断は個々人がするものです。ただ、そういった数字に基づいた検証をしている人は余り多くないと思います。
私が信奉するフローレンス・ナイチンゲールの言葉に、
「どんな仕事をするにせよ、実際に学ぶ事ができるのは現場においてのみである。」
というものがあります。
幸いなことに我々の現場はこの世の地獄の一つである野戦病院ではなく、自宅のPCです。検証に必要な機能や知識は無料で手に入れることが出来ます。これを機に是非ともアバタの負荷について学んでみてはいかかでしょうか。
(謎の締め)
最後に自撮り写真を置いておしまいです。ここまで読んでいただきありがとうございました。
ワールド:「Steps of the Campanula - カンパニュラの足音」by EstyOctober