こんにちは、Unityエンジニアのオオバです。
Unityではメッシュを圧縮する方法が2種類用意されています。
- Vertex Compression
- Mesh Compression
頂点の圧縮とメッシュの圧縮という似たような単語ですが、内容は全然違います。本記事ではこの2つがどのような内容なのか、どういうケースで活用可能なのか紹介していこうと思います。
大きなメッシュを扱う3Dプロダクトを作っている方にとって有益な内容なのでぜひ最後まで読んでみてください。
Vertex CompressionとMesh Compressionを正しく使い分ける
はじめに結論を簡単にまとめます。
①Vertex Compressionは全体効果
②Mesh Compressionは各メッシュごとの設定
③両者は使い所が全く違う
今回紹介する2つの設定は内容が全く違うため、しっかりと理解した上で設定するようにしましょう。特にVertex Compressionは全体にかかる効果ですが、各メッシュごとに後述する設定をしておかないと効果が発揮しません。
この後具体的に解説していきます。
👉DOTweenの教科書を読んでUnityアニメーションをプログラミングしてみよう!
①全体圧縮のVertex Compression
最初に紹介するVertex Compressionは、PlayerSettingsから設定します。
つまりメッシュ全体に効果のある設定です。
Vertex Compressionはどんな圧縮処理なのかというと 頂点情報の精度を下げる ということです。具体的にはfloat型(32bit)からhalf型(16bit)に精度を下げてます。
つまり次の効果が期待できます。
- メッシュのファイルサイズ減少
- ランタイム中の使用メモリの減少
頂点と言っても様々なデータ(チャネル)がありますよね。Vertex Compressionではそれぞれのチャネル毎に適用可能です。
- Position
- Normal
- Tangent
- Color
- Tex Coord 0
- Tex Coord 1
- Tex Coord 2
- Tex Coord 3
合計8種のチャネル毎に設定できます。デフォルト設定では Position
Color
Tex Coord 1
のVertex CompressionはOFFです。
というのも、この3つは精度を落とすと見た目が大きく崩れる可能性があるからです。もし上記3チャネルもVertex Compressionを適用する場合は実機で見た目のチェックをしてみてください。
Vertex Compressionの注意点
圧縮効果の期待できるVertex Compressionですが注意点があります。次の条件下では適用されません。
- メッシュのRead/Write設定がON
- Mesh CompressionがON
- スキンメッシュ
- 16bit精度に対応していない環境
- ダイナミックバッチングされたメッシュ
Vertex Compressionを設定したけど効果がないなぁって思ったら、上記の条件に当てはまっていないかチェックしてみてください。
②メッシュ毎圧縮のMesh Compression
Mesh Compressionはインポートした3DデータのInspectorウィンドウ > Modelから設定できる項目です。
UnityにインポートしたFBXファイルを選択。
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の最後のデメリットは見た目が崩れる場合があるということです。圧縮したメッシュは解凍されて表示されるため、見た目に影響はなさそうなのですが、そうでもありません。
Mesh Compressionには4つの圧縮設定があります。
- Off
- Low
- Medium
- High
それぞれ設定を適用したメッシュの見た目を比較してみましょう。
圧縮率が高まる毎に見た目が崩れているのが分かります。
(アーティファクトが目立ちます)
Mesh Compressionを採用する際にはしっかり実機で見た目をチェックしておきましょう。
まとめ : Unityメッシュの圧縮設定は適切な判断が重要
最後に記事の内容を簡単にまとめます。
①Vertex Compressionはメモリ、ディスクに全体効果
②Vertex Compressionは適用させるための条件あり
③Mesh Compressioinはディスク容量を改善
④Mesh Compressioinの4つのデメリットがある
⑤いずれの設定も実機でテストして採用する
こんな感じです。
今回は Vertex Compression
と Mesh Compression
について解説してきました。ゲーム、アプリのパフォーマンスを上げるための手法として重要な役割を持っています。
解説した通りそれぞれ内容は違いますし、発動条件もそれぞれ存在します。
それらを理解したうえで、パフォーマンス・チューニングする際には検討してみてください。
そして最も重要なのは、適用した際にその前後でどれくらい効果があったのかということです。チェックする際は必ずリリースターゲットの実機を使いましょう。特にUnityエディタ上でテストしても傾向はわかっても実際の数値は当てになりません。必ず「実機」を使う。これ大事です。
パフォーマンスはゲーム、アプリにとって重要な要素です。メッシュ数の多いゲームやアプリを作っている方は本記事が参考になったら嬉しいです。
この記事が気に入ったらフォローしよう
- Unity6000.0.32f1