2024.12.19
システムの穴を運用でカバーしようとしてミス多発… バグが大量発生、決算が合わない状態から業務効率化を実現するまで
VRoid Hubにおける3Dモデルの最適化(全1記事)
リンクをコピー
記事をブックマーク
saturday06氏:こんにちは。『VRoid Hubにおける3Dモデルの最適化』についてエンジニアのMogiが発表します。新規事業部VRoid部エンジニアのMogiと申します。「VRoid」関連の開発を行なっています。趣味でオーボエという楽器をやっています。
今回の発表の題目となる「VRoid Hub」についてです。VRoid Hubは3Dキャラクターの投稿・共有プラットフォームです。投稿した3Dキャラクターが、まるでそこで生きているかのような体験の提供を目指しています。
VRoid Hubを取り巻く周辺サービスを含めた図がこちらです。アップロードされた3Dキャラクターは、ユーザーの許可があればAPI連携により各種アプリケーションで利用可能です。ここで問題になるのが、さまざまな面での3Dモデルの負荷です。
VRoid Hubで扱う3Dモデルのテクスチャはとても多いことがあります。こちらはVRoidのサンプルモデル桜田史利矢で使われているテクスチャです。これらのテクスチャをそのままメモリに展開すると、95MBになります。単純計算で、同じようなモデルを10人表示しようとすると1GB近くなり、メモリが少ない端末では処理ができなくなってしまいます。
ほかにも3Dモデルは描画や、そのための計算負荷が大きくなりがちという問題があります。例えば色の違う髪束一つひとつに対して、個別に描画負荷が発生したり、物理演算などでも重くなったりします。負荷が高いとフレームレートが下がってユーザー体験が悪くなります。特にVRにおいては顕著です。
VRoid Hubと連携したアプリケーションの1つとして、オンライン同人誌即売会「NEOKET」があります。現実の同人誌即売会を再現したうえで、さらにグレードアップして、できるだけ多くの人たちと同時に参加できるアプリケーションを目指しています。そのために、負荷対策は非常に重要です。
負荷軽減のために、VRoid Hubにアップロードされたモデルに対して、次の変換を実行する処理をサーバーサイドに実装しました。1つ目はメモリ負荷の軽減です。テクスチャ画像に対して各プラットフォームに適した圧縮をかけます。
2つ目は描画・計算負荷の軽減です。VRoid Mobile製の結合可能なマテリアル同士を、結合前と同じに見えるように保ったまま結合します。
これらがサーバーサイド処理に用いる主な利用技術です。サーバーサイド処理をするためのアプリケーションの開発環境は、Unityを用いました。本来はゲームを作るための開発環境ですが、コマンドラインで動くプログラムを作れます。各種処理結果の目視確認がUnityのUI上でできますし、ある程度であれば自動化も容易になります。
次は、VRM入出力のUniVRMというライブラリです。UniVRMは変換対象の3DフォーマットであるVRMを扱う際のデファクトスタンダードのライブラリで、利用実績が非常に多いエクスポーターが含まれています。
また、Debian GNU Linux上での動作を想定しています。
1つ目のテクスチャの圧縮です。サーバーサイドでテクスチャを圧縮することによって、メモリの負荷を減らせます。例としてDXT5テクスチャの圧縮を挙げます。生データで16MBだったものが、圧縮して4MBになりました。
プラットフォームやブラウザーで対応している圧縮形式が違うので、それぞれに適した形式を用います。また、アルファのありなしで形式も多少変わります。圧縮率は形式ごとに違いますが、概ね半分から8分の1くらいになります。
PVRTCのところだけカッコが付いていますが、今回の用途でPVRTCは品質に関する問題が出てしまったため、現在は利用していません。
もう1つの変換がマテリアルの結合です。これを行うことにより、プログラムからGPUに対する描画呼び出しの回数を減らせます。例えば図のように、青、赤、緑の描画命令が個別に発生しているものがある場合、似たような設定のマテリアルを結合できます。
またテクスチャだけ違うマテリアルは、アトラス化という手法を用いて結合できます。アトラス化というのは、複数のテクスチャを1枚のテクスチャにまとめる技術です。これによって、先ほどは3回だった描画呼び出しが1回に減ります。
描画命令の呼び出しの負荷は、UnityエディターのSetPass callsという指標で確認できます。VRoid Mobileで作ったモデルに対して、結合を行った結果を示します。結合前は34だったものが、結合後は20になっています。
現在はVRoid Mobileによって作成されたモデルのみマテリアルの結合に対応しています。これはVRoidの開発チーム側が、どのようなマテリアルが存在するかを完全に把握しているからです。徐々に結合できるモデルの種類を拡大する予定です。
これらの変換にかかる時間です。プログラムの起動に1秒で、マテリアルの結合に時間がかかる場合は20秒くらいかかります。
テクスチャの圧縮は非常に時間がかかるため、例えばそれらを軽減するために、テクスチャサイズが大きい場合、はじめにテクスチャのサイズを縮小してからプラットフォームごとの圧縮を行うなどの工夫をしています。
そのほかが10秒くらいで、合計で100秒以内の時間がかかっています。ちょっと時間がかかりすぎなので、改善を進めています。
ここまではサーバーサイド変換の中身の解説でした。ここからは、サーバーサイドでUnityのアプリケーションをどう動かしているか解説します。
変換プログラムを、数種類の異なるLinux上で動作させる必要が出てきました。サーバーレス環境での動作ですが、この環境でDockerなどのコンテナ技術は使えませんでした。
また、一定規模以上の会社でUnityのアプリケーションをビルドするには、ライセンス認証が必要になるので、複数のターゲット向けのビルドを作る場合、負荷が高いです。そのため、一度ビルドしたらどこでも動作するUnityアプリケーションが欲しいと考えました。
では、どうやってビルドするかを説明します。LinuxサーバーでのUnityアプリケーションの実行環境の模式図はこんな感じです。右から、一番えらいLinux Kernelがあって、その上にGNU C Libraryという基本的なシステムの関数を実装しているライブラリがあります。
その上にUnityのアプリケーションが乗っかって、そのUnityのアプリケーションがGUIやOpenGL、GPUのエミュレーションを叩きます。それぞれはXvfb、Mesa、LLVMpipeが担当します。
Unityのアプリケーションをポータブルで別の環境にもっていけるようにするためには、Linux Kernel以外のものを自前で準備する必要があります。自前で準備するというのは、つまり自前でビルドするということです。
ビルドに必要なライブラリがfreedesktopのページにまとまっています。ものすごく多いです。CSVにソースコードのURLやビルドの設定を書いて、がんばって管理しようとしています。これでどうにかビルドできました。
ビルドできたら、次は別の環境にもっていきます。別の環境として、別のGNU C Library、別のLinux Kernelという登場人物が現れました。現在のカーネルとライブラリを抜いた状態で、別のLinux Kernelが僕らの作ったUnityのアプリケーションを起動しようとしている模式図です。
しかし、このままでは起動しませんでした。別のLinux Kernelが、Unityのアプリケーションを起動しようとしますが、別のLinux Kernelにくっついている別のGNU C Libraryが、いつもと別物だぞとエラーが発生してクラッシュしてしまいました。
こういう場合の回避方法がGNU C Libraryに存在しています。ld.soというコマンドを使うとで、別のGNU C Libraryになり代わってプログラムを実行できます。これにより、Unityのアプリケーションが正しく実行できました。
実行結果はこちらです。Unityという単語と、GPUエミュレーションを行なっているLLVMpipeなどの単語が確認できます。この表示のあとに、先ほど説明したテクスチャ圧縮などの変換が行われます。
まとめです。今回はテクスチャの圧縮によってメモリ負荷の軽減を行いました。また、マテリアルの結合による描画の負荷の軽減を行いました。それらを実行するために、Linux上にポータブルなUnityアプリケーションの実行基盤の構築しました。
今後は、メッシュの削減や、VRoid Mobile以外のあらゆるモデルに対するマテリアルの結合や、その他さまざまな変換処理の実装を行います。また、100秒以上かかっている変換の高速化も行う予定です。
アプリケーションの実行基盤に関しては、より安定した、よりスケールできるサーバーサイドのUnityアプリケーションの実行基盤の構築を行います。Dockerなどの利用が可能になったため、Hackに頼らない方式を用いられそうです。
以上です。ありがとうございました。
関連タグ:
2024.12.12
会議で発言しやすくなる「心理的安全性」を高めるには ファシリテーションがうまい人の3つの条件
2024.12.19
12万通りの「資格の組み合わせ」の中で厳選された60の項目 532の資格を持つ林雄次氏の新刊『資格のかけ算』の見所
2024.12.16
32歳で成績最下位から1年でトップ営業になれた理由 売るテクニックよりも大事な「あり方」
2023.03.21
民間宇宙開発で高まる「飛行機とロケットの衝突」の危機...どうやって回避する?
2024.12.10
メールのラリー回数でわかる「評価されない人」の特徴 職場での評価を下げる行動5選
2024.12.13
ファシリテーターは「しゃべらないほうがいい」理由 入山章栄氏が語る、心理的安全性の高い場を作るポイント
PR | 2024.12.20
モンスター化したExcelが、ある日突然崩壊 昭和のガス工事会社を生まれ変わらせた、起死回生のノーコード活用術
2024.12.18
「社長以外みんな儲かる給与設計」にした理由 経営者たちが語る、優秀な人材集め・会社を発展させるためのヒント
2024.12.12
今までとこれからで、エンジニアに求められる「スキル」の違い AI時代のエンジニアの未来と生存戦略のカギとは
PR | 2024.11.26
なぜ電話営業はなくならない?その要因は「属人化」 通話内容をデータ化するZoomのクラウドサービス活用術
Climbers Startup JAPAN EXPO 2024 - 秋 -
2024.11.20 - 2024.11.21
『主体的なキャリア形成』を考える~資格のかけ算について〜
2024.12.07 - 2024.12.07
Startup CTO of the year 2024
2024.11.19 - 2024.11.19
社員の力を引き出す経営戦略〜ひとり一人が自ら成長する組織づくり〜
2024.11.20 - 2024.11.20
「確率思考」で未来を見通す 事業を成功に導く意思決定 ~エビデンス・ベースド・マーケティング思考の調査分析で事業に有効な予測手法とは~
2024.11.05 - 2024.11.05