SteamVRが爆発する

 おはこんハロチャオ、Najikoです。5月はメメナの記事を書こうと思ったんですが、記事を書いている最中に盾を投げられるようになったため環境が変化してしまい、最後まで書かずに終わりました。

 さて、そんなメメナとかにpublicで行くとですね、頻発していた事態がありました。それがSteamVRが重大なエラーを吐いて死ぬ、ということでした。ところがそれについてGrokにエラーログを投げたところ、ある「結論」が出ました。

ホンマか? と思うところもありましたが、エラーログを見る限り確かにそのようなことしか書いてありません。

そうなのか? と思うところはありますが、一旦はこうだと考えて対策を講じてみることにしました。

 何も難しいことはありません。アバターの表示容量制限を下げればいいのです。SteamVRくんはともかくVRCの方も「これ以上読みこむとヤバイな、一旦エラーアバター表示に置き換えよう」みたいな気の利いたことはやってくれないので欲望のままにバカスカRAMとVRAMに展開した情報をぶち込んで、溢れて動かなくなると「何もしてないのに壊れた」と言ってエラー落ちします。
 昔はそれでもエラー落ちはしなかったはずなんですがなんか近頃は簡単に落ちるようになってしまったので仕方ありません。SSDがパンパンで仮想メモリが確保できない、という状態でもないし、一応VRCのキャッシュをクリアした上で、キャッシュ自体の読み書きを他のSSDに移す、ということもしたのですがやはり一気に読みこむと落ちることには変わりなかったので仕方ありません。

 わたくしはこういうときは思い切って下げちゃう方ではなく、できれば普段とあまり変わりなくて問題だけ解消するラインを探るタイプです。まあ、アバター容量50MBを超えてるのはさすがに切ってもいいんじゃないかな? と思って実施してみたところ、普通に16人インスタンスでフリーズしました。ダメか……40……くらいではどうですかね? ああ……まあ、16人程度のインスタンスなら、ギリギリ……あ、山が見えるな……ちょっと危ういか。40人くらいいるポピ横はどうかな? あ……あー、死んだね。爆発しましたね、SteamVRが。クソ、ダメか……じゃあ35……いやここで刻んでも意味ないよもう。30! 30MBでどうだ? お……? おお!!

解決!

 全然落ちなくなりました。ちなみにわたくしの環境を書いてませんでしたね。そうですね、かなり化石になりかけてはいますが、目を覆いたくなるような貧弱さかと言われるとそんなことはないはずです。メモリは(DDR4の2133MT/sですが)32GB、CPUは爆熱になることでお馴染みの10世代intel i9 10900F、グラボはVRAM12GBのRTX3060です。しかし、落ちなくはなりましたが当然ながら悲しいこともあります。

 インスタンスの半数くらいのアバターがフォールバックかガビガビのインポスター表示になっています。嘘でしょ? わたくしは自分でアップロードしたアバターのアバター容量を確認し始めましたが……30を超えてるアバターはほとんどありません。例えAAOを使用していない着せ替えたアバターであってもです。しかし、ちょっとpublicに目を向けるとまあほぼ例外なく4~6割程度のアバターが30MB超えでパフォーマンスランクも当然にVeryPoorです。ポピ横はまだわかるとして、ゲームワールドでもそうです。メメナとかね。たまに軽量化に気を使っててMediumまで落としてあるアバターとか、無改変でGoodのアバターとかを使ってる人もいますが、それ以外はほぼ表示が制限されています。そんなことある?

 うーん、最近のアバターが重いからか? と思い、SuRoomのポリゴンローディングやJPTの展示サンプルを参照して、最近のアバターのサンプルの状態での容量を確認してみました。すると、意外にもデフォルトで30MBを超えているアバターはほとんどいませんでした。ギミックがかなりモリモリだったり、見た目がリッチなアバターでも結果は同じ。たまーに、10体に1体くらいは30超えてる子もいますが……まあ、ちょっと、見なかったことにします。すげー有名人気アバターだったりすることもあるんですが、うん。仕方ないね。

 とはいえです、例えばデフォルトで15MBとか20MBとかだったとして、このまま上げて使う人って意外と多くないわけです。そりゃお金出してアバター買ったんだから、改変をしますよね。すると、ここに衣装を着せ替えて、髪型も変えたりして、アクセサリつけてみたりなんかして……ああ、そうですね、そりゃすぐ30MB超えるよね……いや、超えなくはできるんですよ。まずAAOを入れるだけで少しは削れるはずです。あとはlilAvatarUtilsを使い、無駄に高解像度になってるテクスチャとかマスクとかを適正なサイズ(まあノーマルマップや顔、髪のテクスチャ、柄のついた服などで2Kが限度だと思います)にして(もうちょい細かい設定もありますが)ここまでやればVeryPoorであれポリゴン数が15万超であれまあ、ダウンロード容量は30MBを切るはずです。いやまあ、複数衣装を組み合わせてたり情報量が多かったりすると絶対切るとは言えませんが……けどまあ、これで全然切らない、というのであれば衣装かアクセサリのうちのなんかが著しく最適化を怠っているとしか言いようがない、とは言えます。

 しかし現実はどこに行っても30MB超えアバターが普通。あんまり表示がガビガビだから一回表示してみようか、と個別に表示すると、30ちょっと超えくらいの場合も多いのですが、50とか、下手すると80とかあったりして横転することもしばしば。さすがにそれは……なんだろうな、満員電車でめっちゃパンパンの登山リュックを背中に背負って立ってるみたいな、そういう状態じゃないかなぁと思います。

 わたくしとて初めは登山リュックを背中に背負ったまま電車に乗っていた時期があったとは思います。あ、比喩表現ですよ。だから要するに、衣装を着せて、デフォルトの衣装は非表示(Editor Onlyにしてない)で、テクスチャの解像度なんかいじらないで、そのままアップロードしていたってことです。でもまあ、その時期はアバターも衣装も今ほどはゴテゴテじゃなかったので何とかなってたのかもしれないし、わたくしがゴリゴリに足し算するタイプの改変をしてこなかったからなのかも知れませんが、そこまで重くはなっていませんでした。けど多分、今同じことをするとあっという間に30とか40MB行くと思います。

 当時はMAもNDMFもなかったですし、Unityの仕様を理解するのは大変ですからまあ、仕方なかったかもしれません。しかし、現在はAAOを使うとその辺はある程度非破壊で勝手にやってくれます。

 実際にやってみましょう。

まずAAOを導入してください。

https://booth.pm/ja/items/4885109

で、Unityを開きます。

はい、アバターのいつものインスペクターですね。一番下までスクロールするとAdd Componentがあります。

AAO Trace And Optimizeを入れます。他のやつは気にしなくていいです。

こうなります。

完成!

 たったこれだけです。改変の度合いによってはこれだけだと30切らない場合もあるでしょうけど……

比較してみましょう。この無改変のカザリスちゃんでAAOを使わない場合

15.6MBですね。

使った場合

13.7MBになりました。

すごい削減!とは言えないですが……見た目や機能に一切影響がない範囲でこれだけやってくれるわけですから、入れ得というやつです。

 話が逸れましたが、うんまあ……現実として今の、そしてこれからのVRChatは大人数のインスタンスに無対策で入るのはマシンスペックの要求値が相当に高いということはお分かりいただけたかと思います。あと今回はVRChat側にダウンロードサイズで弾く設定しかないからダウンロードサイズで線引きしていますが、実際にはダウンロードサイズは小さいのにテクスチャ容量がデカすぎるみたいなアバターも理論上なくはない(なんでそうなるのかはよくわかりませんが)し、VRAMを食うのはテクスチャの方なので気を使うべきはそっちなんですけど……ただ結局相関としてはダウンロードサイズがバカでかいアバターは大体テクスチャもバカでかい(逆も然り)から30MBで線引きすれば落ちなくなった、ということなんだと思います。難しい。

ちなみにたまなつちゃんはアバターのダウンロードサイズ3.7MBくらいだったと思います。かわいいね。

ではまたVRCでお会いしましょう……わたくしと会う方はダウンロードサイズ30MB超えてると、ガビガビに見えてるかも知れませんが……

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)