こんにちは、Unityエンジニアのオオバです。

お悩みさん
お悩みさん
  • メッシュデータが大きくて圧縮したい
  • メッシュ関連のパフォーマンスチューニング方法を知りたい
  • オオバ
    オオバ
    本記事ではこれらの悩みを解決します。

    Unityではメッシュを圧縮する方法が2種類用意されています。

    1. Vertex Compression
    2. Mesh Compression

    頂点の圧縮とメッシュの圧縮という似たような単語ですが、内容は全然違います。本記事ではこの2つがどのような内容なのか、どういうケースで活用可能なのか紹介していこうと思います。

    大きなメッシュを扱う3Dプロダクトを作っている方にとって有益な内容なのでぜひ最後まで読んでみてください。

    Vertex CompressionとMesh Compressionを正しく使い分ける

    はじめに結論を簡単にまとめます。

    Vertex CompressionとMesh Compressionを正しく使い分ける

    ①Vertex Compressionは全体効果

    ②Mesh Compressionは各メッシュごとの設定

    ③両者は使い所が全く違う

    今回紹介する2つの設定は内容が全く違うため、しっかりと理解した上で設定するようにしましょう。特にVertex Compressionは全体にかかる効果ですが、各メッシュごとに後述する設定をしておかないと効果が発揮しません。

    この後具体的に解説していきます。

    ※本記事は広告を含みます

    👉DOTweenの教科書を読んでUnityアニメーションをプログラミングしてみよう!

    ①全体圧縮のVertex Compression

    最初に紹介するVertex Compressionは、PlayerSettingsから設定します。

    【Unity】3Dメッシュ圧縮設定完全解説_0

    つまりメッシュ全体に効果のある設定です。

    Vertex Compressionはどんな圧縮処理なのかというと 頂点情報の精度を下げる ということです。具体的にはfloat型(32bit)からhalf型(16bit)に精度を下げてます。

    つまり次の効果が期待できます。

    頂点と言っても様々なデータ(チャネル)がありますよね。Vertex Compressionではそれぞれのチャネル毎に適用可能です。

    【Unity】3Dメッシュ圧縮設定完全解説_1

    合計8種のチャネル毎に設定できます。デフォルト設定では Position Color Tex Coord 1 のVertex CompressionはOFFです。

    というのも、この3つは精度を落とすと見た目が大きく崩れる可能性があるからです。もし上記3チャネルもVertex Compressionを適用する場合は実機で見た目のチェックをしてみてください。

    Vertex Compressionの注意点

    圧縮効果の期待できるVertex Compressionですが注意点があります。次の条件下では適用されません。

    Vertex Compressionを設定したけど効果がないなぁって思ったら、上記の条件に当てはまっていないかチェックしてみてください。

    ②メッシュ毎圧縮のMesh Compression

    Mesh Compressionはインポートした3DデータのInspectorウィンドウ > Modelから設定できる項目です。

    【Unity】3Dメッシュ圧縮設定完全解説_2

    UnityにインポートしたFBXファイルを選択。

    【Unity】3Dメッシュ圧縮設定完全解説_3

    Inspectorウィンドウ内のModelタブ内に Mesh Compression

    Mesh Compressionの処理内容とは?

    Mesh CompressionはUnity内部のアルゴリズムによって、頂点、法線、接戦、UVといったデータを圧縮します。この圧縮によって何が良いのかと言うと、メッシュデータ自体の軽量化です。

    もし、このメッシュがアプリ内に格納されていたら?
    → アプリサイズが減ります

    もし、このメッシュがアセットバンドル化されていたら?
    → アセットバンドルのファイルサイズが減少します

    大事なことは、あくまでファイルサイズが下がるだけで ランタイム中の使用メモリに変化はない ということです。

    一見、ファイルサイズが圧縮できてハッピーなMesh Compressionですが、使用する際はいくつか注意点があります。

    注意点①解凍時間の発生

    Mesh Compressionのデメリットの1つは圧縮したメッシュをランタイム中に 解凍する時間が発生してしまうこと です。

    圧縮したものをそのまま使うわけにはいかないため、どうしても使用する時(Unityがメッシュをメモリにロードする時)解凍処理が発生してしまうのです。

    つまりメッシュを解凍するためのCPU負荷が増加するということを覚えておきましょう。

    注意点②解凍時にメモリを使用

    Mesh Compressionのデメリットその2は解凍するときには解凍用の一時的なメモリが確保されてしまうことです。

    解凍するタイミングでより多くのメモリを消費してしまうため、メッシュ使用時に想定より使用メモリが多くなっていないかプロファイルすることを忘れないようにしましょう。

    注意点③Vertex Compressionの無効化

    Mesh Compressionのデメリットその3はMesh Compressionを有効化したメッシュは前述のVertex Compressionが無効化されることです。

    つまりMesh Compressionの適用前後でメッシュの使用メモリが上がります。こちらもMesh Compressionの使用前後でプロファイルしてどちらが総合的に良いのか判断する必要があるということです。

    注意点④見た目が崩れることもある

    Mesh Compressionの最後のデメリットは見た目が崩れる場合があるということです。圧縮したメッシュは解凍されて表示されるため、見た目に影響はなさそうなのですが、そうでもありません。

    【Unity】3Dメッシュ圧縮設定完全解説_4

    Mesh Compressionには4つの圧縮設定があります。

    それぞれ設定を適用したメッシュの見た目を比較してみましょう。

    【Unity】3Dメッシュ圧縮設定完全解説_5

    圧縮率が高まる毎に見た目が崩れているのが分かります。
    (アーティファクトが目立ちます)

    Mesh Compressionを採用する際にはしっかり実機で見た目をチェックしておきましょう。

    まとめ : Unityメッシュの圧縮設定は適切な判断が重要

    最後に記事の内容を簡単にまとめます。

    Unityメッシュの圧縮設定は適切な判断が重要

    ①Vertex Compressionはメモリ、ディスクに全体効果

    ②Vertex Compressionは適用させるための条件あり

    ③Mesh Compressioinはディスク容量を改善

    ④Mesh Compressioinの4つのデメリットがある

    ⑤いずれの設定も実機でテストして採用する

    こんな感じです。

    今回は Vertex CompressionMesh Compression について解説してきました。ゲーム、アプリのパフォーマンスを上げるための手法として重要な役割を持っています。

    解説した通りそれぞれ内容は違いますし、発動条件もそれぞれ存在します。

    それらを理解したうえで、パフォーマンス・チューニングする際には検討してみてください。

    そして最も重要なのは、適用した際にその前後でどれくらい効果があったのかということです。チェックする際は必ずリリースターゲットの実機を使いましょう。特にUnityエディタ上でテストしても傾向はわかっても実際の数値は当てになりません。必ず「実機」を使う。これ大事です。

    パフォーマンスはゲーム、アプリにとって重要な要素です。メッシュ数の多いゲームやアプリを作っている方は本記事が参考になったら嬉しいです。

    オススメ記事
    検証環境