Version: 2022.2
言語: 日本語
LOD メッシュのインポート
テクスチャとメッシュデータのロード

メッシュデータの圧縮

Unity ではメッシュデータを圧縮してサイズを小さくし、パフォーマンスを向上できます。Unity にはメッシュを圧縮する方法が 2 つあります。これらの動作は異なり、パフォーマンスの違う側面に影響を与えます。

  • Vertex Compression は、プロジェクト内のすべてのメッシュに影響する設定です。この設定では、メッシュに低精度のデータ形式を使用することができます。これにより、メモリ内のメッシュデータのサイズが小さくなり、ファイルサイズがわずかに減少し、GPU パフォーマンスが向上する可能性があります。ただし、精度が落ちるというデメリットがあります。
  • Mesh Compression は、個々のメッシュに影響する設定です。ディスク上のメッシュデータを圧縮し、ファイルサイズを小さくします。デメリットとしては、ロード時間の増加、ロード時の一時的なメモリ使用量の増加、圧縮によるアーティファクトの可能性があります。

同じプロジェクトで両方の圧縮方法を使用することはできますが、同じメッシュに使用することはできません。メッシュに Mesh Compression を適用した場合、Unity はそのメッシュに Vertex Compression を適用しません。

ノート: Unity の Vertex Compression と Mesh Compression のデフォルト設定は、ほとんどのプロ ジェクトに適しています。問題がある場合のみこれらの設定を変更し、結果を評価して、変更が役に立ったことを確認する必要があります。

Vertex Compression

Vertex Compression (頂点圧縮) の設定では、プロジェクト内のすべてのメッシュに低精度のデータ形式を使用することができます。これは、特定のデータチャネルのデータ型を設定することによって行われます。

あるチャンネルのデータ型を FP32 (Floating Point32、32 ビット浮動小数点数) から FP16 (Floating Point16、半精度浮動小数点数) に変更することができます。FP16 形式は FP32 形式よりも小数点以下の桁数が少ない数値が格納されます。つまり、使用する容量は小さくなりますが、精度は若干低下します。

FP32 から FP16 に変換されたデータは、メモリ上の容量が少なくなり、ディスク上の容量もわずかに少なくなります。GPU では、データのメモリバンド幅が少なくなり、GPU のパフォーマンスが少し向上する可能性があります。

頂点圧縮技術は、圧縮する頂点の属性の数によって異なる比率でメッシュを圧縮します。法線、接線、色、3 セットの UV 座標を圧縮する場合、圧縮率は通常約 1.45 倍です。

Vertex Compression の限界

Vertex Compression (頂点圧縮) を使用するには、メッシュが以下の要件を満たしている必要があります。

  • メッシュは、 Read/Write Enabled プロパティを無効にしておく必要があります。このプロパティは、Model Import Settings ウィンドウの Model タブで変更することができます。
  • メッシュはスキンされたメッシュであってはなりません。
  • ターゲットプラットフォームが FP16 値をサポートしている必要があります。
  • メッシュを含むモデルは、 Mesh Compression の値が “Off ” に設定されている必要があります。
  • The mesh is not eligible for dynamic batching or dynamic batching is turned off in the player settings.

メッシュがこれらの要件のいずれかを満たさない場合、Unity はそのメッシュに頂点圧縮を適用せず、メッシュ上のすべてのデータチャネルが FP32 精度の数値を使用します。

Vertex Compression の設定

Vertex Compression の設定は以下のように変更します。 1. Player 設定を開きます (menu: Edit > Project Settings > Player)。 1. Other Settings サブメニューを開き、Optimization に移動します。 1. Vertex Compression ドロップダウンを選択し、任意のチャンネルを選択して、そのチャンネルの圧縮を有効または無効にします。また、None を選択するとすべてのチャンネルの圧縮が無効になり、Everything を選択するとすべてのチャンネルの圧縮が有効になります。

デフォルトでは、Vertex Compression は Mixed に設定され、これはドロップダウンで複数の選択がアクティブなときに表示されます。デフォルトでは、Unity は以下のチャンネルに Vertex Compression を使用します。

  • Normal
  • Tangent
  • Tex Coord 0
  • Tex Coord 2
  • Tex Coord 3

大抵、この設定の組み合わせで、メッシュの外観を大きく変えることなくメモリを節約できるため、デフォルトで Unity はこれらのチャンネルを圧縮します。他の設定である Position と Tex Coord 1 はメッシュの外観に影響を与える可能性が高く、メモリ使用量を大幅に削減できないため、デフォルトでは、Unity はそれらの設定を圧縮しません。Position と Tex Coord 1 チャンネルの Vertex Compression を有効にする場合は、設定をテストし、メッシュにアーティファクトが発生しないことを確認してください。

Mesh Compression

Mesh Compression (メッシュ圧縮) の設定を使用して、ディスクの指定されたモデルアセットのメッシュデータを圧縮することができます。Mesh Compression アルゴリズムは Vertex Compression 手法よりも積極的であるため、圧縮率が高くその結果ファイルサイズが小さくなります。しかし、デメリットも多くなります。

この設定を適用すると、Unity はアルゴリズムを使用して、各圧縮チャンネルの明示的な値を、最大値と最小値の間の範囲に置き換えます (固定ビット数でその範囲で各値を表現されます)。これにより、ディスク上のメッシュデータのサイズが減少します。Unity がメッシュをメモリにロードするときに、データを解凍します。つまり、この範囲を元の値に変換します。この後、パフォーマンスに影響はありません。

この手法は、最終的なビルドサイズやメッシュが含まれる AssetBundle のサイズをできるだけ減らす必要があり、ランタイムの解凍によるパフォーマンスの低下が許容できる場合に、有効です。

Mesh Compression の限界

ランタイムに、メッシュの解凍に追加の CPU リソースを使用します。つまり、メッシュ データのロードに時間がかかります。また、メッシュを解凍する際に、より多くの一時メモリが使用されます。

さらに、圧縮率が比較的高いため、Unity でメッシュを解凍するときに不要なアーティファクトが表示されることがあります。これらのアーティファクトを避けるには、圧縮するメッシュに対して各オプションをテストし、正しく表示されることを確認する必要があります。

Mesh Compression の設定

Model Import 設定ウィンドウの Mesh Compression 設定
Model Import 設定ウィンドウの Mesh Compression 設定

Mesh Compression の設定を使用する方法は、以下の通りです。

  1. プロジェクトの Assets フォルダにあるモデルを選択し、Import Settings ウィンドウの Model タブを開きます。
  2. メッシュの見出しに移動し、Mesh Compression 設定を見つけます。
  3. ドロップダウンメニューを選択すると、その Model に含まれる全てのメッシュのレベルを選択することができます。また、ModelImporterMeshCompression 列挙を使用して、コード内でこの設定を変更することができます。

利用可能な値は、High (高)、Medium (中)、Low (低)、または Off (オフ) です。以下の表は、各設定における代表的な圧縮率を示しています。

Value Vertices (頂点) Normals (法線) Tangents (接線) UVs Color (色)
Off 1.0 1.0 1.0 1.0 1.0
Low 1.6 4.6 4.4 2.0 1.0
Medium 2.0 5.6 5.3 3.2 1.3
High 3.2 7.4 6.7 4.0 2.0

メッシュ圧縮手法の圧縮率

ノート: 上表の “Color” 列は、UNorm8 形式を使用するメッシュの比率を表しています。頂点色に FP32 形式を使用するメッシュの場合、比率は Low 設定で 4.0、Medium 設定で 5.3、High 設定で 8.0 です。

LOD メッシュのインポート
テクスチャとメッシュデータのロード