Unity ではメッシュデータを圧縮してサイズを小さくし、パフォーマンスを向上できます。Unity にはメッシュを圧縮する方法が 2 つあります。これらの動作は異なり、パフォーマンスの違う側面に影響を与えます。
同じプロジェクトで両方の圧縮方法を使用することはできますが、同じメッシュに使用することはできません。メッシュに Mesh Compression を適用した場合、Unity はそのメッシュに Vertex Compression を適用しません。
ノート: Unity の Vertex Compression と Mesh Compression のデフォルト設定は、ほとんどのプロ ジェクトに適しています。問題がある場合のみこれらの設定を変更し、結果を評価して、変更が役に立ったことを確認する必要があります。
Vertex Compression (頂点圧縮) の設定では、プロジェクト内のすべてのメッシュに低精度のデータ形式を使用することができます。これは、特定のデータチャネルのデータ型を設定することによって行われます。
あるチャンネルのデータ型を FP32 (Floating Point32、32 ビット浮動小数点数) から FP16 (Floating Point16、半精度浮動小数点数) に変更することができます。FP16 形式は FP32 形式よりも小数点以下の桁数が少ない数値が格納されます。つまり、使用する容量は小さくなりますが、精度は若干低下します。
FP32 から FP16 に変換されたデータは、メモリ上の容量が少なくなり、ディスク上の容量もわずかに少なくなります。GPU では、データのメモリバンド幅が少なくなり、GPU のパフォーマンスが少し向上する可能性があります。
頂点圧縮技術は、圧縮する頂点の属性の数によって異なる比率でメッシュを圧縮します。法線、接線、色、3 セットの UV 座標を圧縮する場合、圧縮率は通常約 1.45 倍です。
Vertex Compression (頂点圧縮) を使用するには、メッシュが以下の要件を満たしている必要があります。
メッシュがこれらの要件のいずれかを満たさない場合、Unity はそのメッシュに頂点圧縮を適用せず、メッシュ上のすべてのデータチャネルが FP32 精度の数値を使用します。
Vertex Compression の設定は以下のように変更します。 1. Player 設定を開きます (menu: Edit > Project Settings > Player)。 1. Other Settings サブメニューを開き、Optimization に移動します。 1. Vertex Compression ドロップダウンを選択し、任意のチャンネルを選択して、そのチャンネルの圧縮を有効または無効にします。また、None を選択するとすべてのチャンネルの圧縮が無効になり、Everything を選択するとすべてのチャンネルの圧縮が有効になります。
デフォルトでは、Vertex Compression は Mixed に設定され、これはドロップダウンで複数の選択がアクティブなときに表示されます。デフォルトでは、Unity は以下のチャンネルに Vertex Compression を使用します。
大抵、この設定の組み合わせで、メッシュの外観を大きく変えることなくメモリを節約できるため、デフォルトで Unity はこれらのチャンネルを圧縮します。他の設定である Position と Tex Coord 1 はメッシュの外観に影響を与える可能性が高く、メモリ使用量を大幅に削減できないため、デフォルトでは、Unity はそれらの設定を圧縮しません。Position と Tex Coord 1 チャンネルの Vertex Compression を有効にする場合は、設定をテストし、メッシュにアーティファクトが発生しないことを確認してください。
Mesh Compression (メッシュ圧縮) の設定を使用して、ディスクの指定されたモデルアセットのメッシュデータを圧縮することができます。Mesh Compression アルゴリズムは Vertex Compression 手法よりも積極的であるため、圧縮率が高くその結果ファイルサイズが小さくなります。しかし、デメリットも多くなります。
この設定を適用すると、Unity はアルゴリズムを使用して、各圧縮チャンネルの明示的な値を、最大値と最小値の間の範囲に置き換えます (固定ビット数でその範囲で各値を表現されます)。これにより、ディスク上のメッシュデータのサイズが減少します。Unity がメッシュをメモリにロードするときに、データを解凍します。つまり、この範囲を元の値に変換します。この後、パフォーマンスに影響はありません。
この手法は、最終的なビルドサイズやメッシュが含まれる AssetBundle のサイズをできるだけ減らす必要があり、ランタイムの解凍によるパフォーマンスの低下が許容できる場合に、有効です。
ランタイムに、メッシュの解凍に追加の CPU リソースを使用します。つまり、メッシュ データのロードに時間がかかります。また、メッシュを解凍する際に、より多くの一時メモリが使用されます。
さらに、圧縮率が比較的高いため、Unity でメッシュを解凍するときに不要なアーティファクトが表示されることがあります。これらのアーティファクトを避けるには、圧縮するメッシュに対して各オプションをテストし、正しく表示されることを確認する必要があります。
Mesh Compression の設定を使用する方法は、以下の通りです。
利用可能な値は、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 です。