【Unity Optimize】アトラス(Sprite Atlas)を使ってプロジェクトを最適化する

1 スプライト アトラスの概要

Unity の Atlas (Sprite Atlas) は、ゲームのパフォーマンスとメモリを最適化するために使用されるテクスチャ セットです。Sprite Atlas は、2D および 3D プロジェクトの UI、パーティクル システム、テクスチャなどに適用できます。

Unity で Sprite Atlas を作成すると非常に便利です。Sprite Atlas GameObject を作成し、それにテクスチャを割り当てるだけです。Sprite Atlas を作成する場合は、役割や機能ごとにテクスチャ名を整理し、インポート設定を行う必要があります。テクスチャが追加されると、Unity はそれらを最適なレイアウトで Sprite Atlas 全体に自動的に分散し、GPU がテクスチャを個別にではなくバッチで処理できるようにします。ただし、テクスチャがスプライト アトラスを完全に埋めることができない場合は、複数のスプライト アトラスを組み合わせてスペース使用率を最大化できます。

2 スプライト アトラスの作成と構成

2.1 スプライトアトラスの作成

2.1.1 Unity2Dプロジェクト

Unity 2D プロジェクトで、[プロジェクト] パネルの [アセット] フォルダー内の [作成] → [2D] → [スプライト アトラス] を右クリックして、スプライト アトラスを作成します。
ここに画像の説明を挿入

2.1.2 Unity3D プロジェクト

Unity 3D プロジェクトでは、設定でアトラスを開く必要があり、プロジェクト パネルでスプライト アトラスを作成できます。
メニュー バーで、[編集] → [プロジェクト設定] → 左側のサイド バーで [エディタ] を見つけ、→ 右側で [スプライト パッカー] を見つけます。必要に応じて [モード] プロパティが選択されています (デフォルトは [無効])。

ここに画像の説明を挿入

さらに、メニュー バーの [ウィンドウ] → [パッケージ マネージャー] で 2D Sprite パッケージをインストールする必要があります。

スプライトパック

パッケージのインストールが完了したら、同じ方法で Sprite Atlas を作成します。

ここに画像の説明を挿入

2.2 スプライト アトラスの構成

[プロジェクト] パネルで新しく作成したスプライト アトラスをクリックして、その [インスペクター] パネルのプロパティを確認します。

  • タイプ: マスターまたはバリアント。Master Sprite Atlas と Variant Sprite Atlas を組み合わせると、2D ゲーム アセットの管理を大幅に簡素化できます。

    • マスター: マスター スプライト アトラスには、スプライトのセットと、すべてのスプライトに共通のテクスチャ情報が含まれています。マスター スプライト アトラスを作成および編集する場合、特定の解像度やプラットフォームを考慮する必要はなく、スプライトとスプライトのテクスチャ マテリアルをそれに追加するだけです。スプライトのレンダリング効率を高めるために、スプライトはマスター スプライト アトラスの同じテクスチャにパックされます。
      ここに画像の説明を挿入

    • バリアント: バリアント スプライト アトラスはマスター スプライト アトラスを利用し、それをさまざまなプラットフォームまたは解像度に割り当てて、さまざまなテクスチャ バリアントを生成します。バリアント スプライト アトラスは、最終的に実行されるプラットフォームとデバイスを考慮した、事前設定されたプラットフォーム固有のスプライト アトラスから生成されます。このうち、Scaleを変更するとSprite Atlasの解像度を変更できます。
      ここに画像の説明を挿入

  • ビルドに含める: ビルドにスプライト アトラスを含めるかどうか。

    • このオプションがオフの場合、スプライト アトラスはビルドに含まれないため、ゲーム内で手動でロードする必要があります。
    • このオプションをオンにすると、Sprite Atlas がビルドに自動的に組み込まれます。
  • 回転を許可: スプライトの回転を許可するかどうか。

    • チェックすると、パッカーはスプライトを回転させて、可能な限り空きスペースを埋めることができます。
    • 梱包効果を高めるためにチェックすることをお勧めします。
  • 密梱包: 精密梱包技術を有効にするかどうか。

    • 有効にすると、パッカーはスプライト境界をより正確に計算しますが、より多くのメモリを消費します。
    • リソースに制約がある状況では、それを閉じることをお勧めします。
  • アルファ拡張: アルファ拡張フィルタリングを適用するかどうか。これは、スプライトを拡大したときにエッジがギザギザになるのを防ぐなど、スプライトのレンダリング品質を向上させるのに役立ちます。

  • パディング: スプライトがパッケージ化されるときのパディングの量を設定します。これは、スプライト間の距離を制御し、Atlas でのスプライト間の重なりや角の遷移を避けるために使用されます。2、4、または 8 ピクセルに設定できます。

  • 読み取り/書き込み: Sprite Atlas でのテクスチャの読み取りおよび書き込み操作を許可するかどうか。

    • スプライトのピクセル データを変更する必要がない場合は、パフォーマンスとメモリ使用量を向上させるためにこのオプションをオフにすることをお勧めします。
  • ミップマップの生成: ミップマップを生成するかどうか。

    • ゲームで遠くからテクスチャをレンダリングする必要がある場合は、このオプションを有効にして画質とパフォーマンスを向上させることをお勧めします。
  • sRGB: sRGB 形式を有効にするかどうか。

    • チェックされている場合は sRGB 形式が使用され、チェックされていない場合はリニア形式が使用されます。
  • フィルター モード: Sprite Atlas のテクスチャ フィルター モードを設定します。トリリニア、バイリニア、またはポイントを選択できます。

    • トリリニア モードでは、3 つの MIP を使用してプログレッシブ ディテールを滑らかにします。
    • バイリニア モードでは、2 つの MIP を使用してプログレッシブな詳細を滑らかにします。
    • ポイント モードでは、テクスチャ内のターゲット ピクセルに最も近いテクセルが表示されます。
  • 次のプラットフォーム設定を表示: 各プラットフォームの構成を指定します。各プラットフォームがサポートするテクスチャ解像度や最大スプライトサイズなどを設定できます。

    • 最大テクスチャ サイズ: テクスチャの最大解像度。選択するときは、さまざまなデバイスの機能とサポートされる解像度の違いを考慮する必要があります。
    • フォーマット: テクスチャのフォーマット。さまざまな形式から選択して、品質、サイズ、実行時のパフォーマンスの最適なバランスを見つけます。
      • 自動: Unity のデフォルト設定。これにより、Unity は最適なピクセル形式を自動的に選択できます。ほとんどの場合、これが最良の選択です。
      • RGBA 32 ビット: これは最も一般的なピクセル形式の 1 つであり、RGBA の 4 つのチャネルが含まれています。この形式を使用すると最高の画質が得られますが、より多くのメモリと帯域幅が必要になります。
      • RGB 16 ビット: この形式では使用するメモリは少なくなりますが、使用する帯域幅も少なくなります。RGB チャネルのみが含まれるため、画像にアルファ チャネルが必要ない場合に選択する形式です。
      • RGB 24 ビット: この形式にも RGB チャネルのみが含まれますが、各チャネルは RGB 16 ビットよりも細かいため、より多くのスペースを必要とします。
      • R 8: この形式にはチャネルが 1 つしか含まれていないため、主にハイト マップやライト マップなどの単一チャネル データを保存するテクスチャに使用されます。
      • R 16 ビット: このフォーマットにも 1 つのチャネルのみが含まれますが、各チャネルはより高い精度を保存するためにより多くのメモリを使用します。
      • Alpha 8: この形式にはアルファ チャネルのみが含まれます。単純な透明度情報のみが必要な場合には、メモリをほとんど消費しない Alpha 8 が最適です。
    • 圧縮: 圧縮品質。ニーズに応じて、低品質、通常品質、高品質を選択できます。圧縮品質が高くなるほど圧縮率も高くなりますが、同時にテクスチャの品質に明らかな影響を与えるため、画像の細部が失われる可能性があります。高品質の圧縮によりテクスチャ サイズが大きくなり、一部のプラットフォームではパフォーマンスの問題が発生する可能性があります。
    • クランチ圧縮を使用: ゼロ遅延圧縮 (クランチ圧縮) アルゴリズムの使用を選択するかどうか。このアルゴリズムにより、より高い品質とより速い読み込み時間を維持しながら、テクスチャをより小さいサイズで保存できます。ただし、Crunch 圧縮は圧縮に時間がかかるため、ビルド時間が長くなる可能性があります。
  • パッキングするオブジェクト: どのアトラスにスプライト アトラスのスプライトがパッキングされます。

    • フォルダー、テクスチャ、または個々のスプライトを選択できます。
    • 空白のままにすると、Unity はスプライトをすべてのスプライト アトラスにパックしようとします。
  • Pack Preview: このボタンをクリックすると、Unity がスプライトをどのようにレイアウトするかのプレビューが表示されます。
    ここに画像の説明を挿入

2.3 注意事項

  • UGUI のパッケージ化 Sprite Atlas は Tight Packing をチェックできません。チェックしないと、スプライトが重なってしまいます。
    • UGUI は四角形グラフィックス レンダリングに基づいているため、各サブピクチャに四角形を使用してレンダリングします。[Tight Packing] オプションがチェックされている場合、UGUI はコンパクトなスタッキング方法を使用して長方形をまとめて配置します。ただし、スプライトが正方形でない場合、または回転している場合、この積み重ねにより長方形が互いに交差し、正しくレンダリングされなくなります。
  • また、Sprite Renderer では Tight Packing をチェックできます。
    • スプライト レンダラーがスプライト アトラスを処理する場合、スプライトの不透明な部分に基づいてメッシュが生成されるため、回転したスプライトや密集したスプライトを使用できます。Sprite Renderer コンポーネントの Tight Packing オプションは、テクスチャが占めるスペースを節約するだけであり、スプライトの表示効果には影響しません。
  • SpineのアトラスPNGはメモリが2部になるためUnityのSprite Atlasにパッケージ化されており、
    • Spine はアトラスの PNG を直接読み取り、SpriteAtlas 内の画像と自動的に関連付けません。Spine atlas PNG を Unity の Sprite Atlas にパックすると、メモリ使用量が 2 コピー発生し、リソースが無駄になります。

3 Sprite Atlasのインターフェース

Sprite Atlas は、スプライトを簡単に作成、管理、アクセスするためのいくつかのインターフェイスを提供します。以下は、Sprite Atlas の一般的に使用されるアクセス インターフェイスの例です。APIインターフェイス-SpriteAtlasExtensionsを参照してください

using UnityEditor;
using UnityEditor.U2D;
using UnityEngine;
using UnityEngine.U2D;

public class AtlasAPI : MonoBehaviour
{
    
    
    public Texture2D[] textures; // 存储图片的数组

    // Start is called before the first frame update
    void Start()
    {
    
    
        // 创建 SpriteAtlas
        SpriteAtlas spriteAtlas = new SpriteAtlas();

        // 将图片添加到 SpriteAtlas
        foreach (Texture2D texture in textures)
        {
    
    
            // 创建 Sprite 对象
            Sprite sprite = Sprite.Create(texture, new Rect(0, 0, texture.width, texture.height), Vector2.zero);
            // 添加到 SpriteAtlas 中
            spriteAtlas.Add(new Sprite[] {
    
     sprite });
        }

        // 将创建的 SpriteAtlas 保存为 .spriteatlas 文件
        AssetDatabase.CreateAsset(spriteAtlas, "Assets/NewSpriteAtlas.spriteatlas");
        AssetDatabase.Refresh();

        // 获取当前平台的名称
        spriteAtlas.GetPlatformSettings(GetPlatformName(EditorUserBuildSettings.activeBuildTarget));
        // 修改对应平台上的图集设置
        spriteAtlas.SetPlatformSettings(new TextureImporterPlatformSettings
        {
    
    
            maxTextureSize = 2048,
            textureCompression = TextureImporterCompression.CompressedHQ,
            format = TextureImporterFormat.Automatic,
        });

    }

    string GetPlatformName(BuildTarget target)
    {
    
    
        string platformName = "";
        switch (target)
        {
    
    
            case BuildTarget.Android:
                platformName = "Android";
                break;
            case BuildTarget.iOS:
                platformName = "iPhone";
                break;
            case BuildTarget.PS4:
                platformName = "PS4";
                break;
            case BuildTarget.XboxOne:
                platformName = "XboxOne";
                break;
            case BuildTarget.NoTarget:
                platformName = "DefaultTexturePlatform";
                break;
            default:
                platformName = "Standalone";
                break;
        }
        return platformName;
    }
}

Sprite Atlas の 4 つの最適化提案

Sprite Atlas を使用してゲームを最適化するためのいくつかの提案を次に示します。

  • 同じサイズとタイプのスプライトを同じスプライト アトラスに配置します。

  • 圧縮されたスプライト ピクセル フォーマット。

  • スプライトの回転を許可すると、Sprite Atlas にパックできるスプライトの数が増加します。

  • スプライト アトラスのサイズがハードウェア デバイスでサポートされている最大テクスチャ サイズを超えていないことを確認してください。

  • 実行時にオンデマンドで Sprite Atlas を非同期的にロードおよびアンロードします。

おすすめ

転載: blog.csdn.net/qq_41084756/article/details/130979262