Zieltexturkomprimierungsformate in Android App Bundles

Texturen sind Bilder, die auf die Oberfläche eines 3D-Modells angewendet werden können. Texturen werden auch von 2D-Renderern verwendet, um Elemente wie Sprites oder Hintergründe zu zeichnen. Auf dieser Seite werden gängige Texturkomprimierungsformate beschrieben, die in Spielen verwendet werden, und ihre Ausrichtung in Android App Bundles. Lesen Sie Informationen zu Android App Bundles und Play Asset Delivery, bevor Sie mit diesem Leitfaden beginnen.

Hintergrund

GPUs unterstützen in der Regel eine Reihe von Texturkomprimierungsformaten. Ein Texturkomprimierungsformat (TCF) ist ein Dateiformat, das für GPUs optimiert ist. Die GPU lädt und rendert Texturen schneller und mit weniger Arbeitsspeicher, als wenn sie ein Array von RGBA-Werten im Arbeitsspeicher verwendet hätte. Diese Unterstützung erfolgt auf Hardwareebene: Der GPU-Hersteller bettet Komponenten in den Grafikkartenchip ein, die die unterstützten Formate lesen, dekomprimieren und rendern.

Folgende Texturkomprimierungsformate werden auf moderner mobiler Hardware häufig verwendet:

  • ASTC: Ein aktuelles Format, das frühere Formate ersetzt. Flexibler als vorherige Formate aufgrund der Unterstützung verschiedener Blockgrößen Mit diesem Format lässt sich die Größe des Spiels gut optimieren.
  • ETC2: Wird von allen Geräten unterstützt, die OpenGL ES 3.0 und höher unterstützen. Dazu gehören fast alle aktiven Android-Mobilgeräte.

Diese Formate werden von den folgenden ungefähren Prozentsätzen von Android-Geräten unterstützt:

Texturkomprimierungsformat Prozentsatz der Google Play-Geräte mit Support
Logo: ASTC >80%
ETC2 >95%

Computer-GPUs, auf denen Google Play Spiele für PC ausgeführt wird, unterstützen auch dieses Format:

  • DDS oder S3TC: Manchmal auch BCn, DXTC oder DXTn genannt.

Zu den älteren, nicht mehr empfohlenen Texturkomprimierungsformaten gehören:

  • ETC1: Wird auf den meisten Geräten unterstützt. Dieses Format unterstützt keine Transparenz, aber Spiele können eine zweite Texturdatei für die Alphakomponente verwenden.
  • PVRTC: Beliebt bei iOS-Spielen und wird auch auf einigen Android-Geräten unterstützt.

ETC1-Unterstützung ist nur für Spiele erforderlich, die sehr alte ältere Geräte unterstützen, oder für ausgewählte Android TV-Geräte, die OpenGL ES 3.0 und höher nicht unterstützen.

Ein Standardformat

Bei so vielen verfügbaren Formaten (mit unterschiedlicher Geräteunterstützung) wissen Sie vielleicht nicht, welche Formate Sie für die Erstellung von Spieltexturen verwenden sollen. Zur Sicherheit können Sie beim App-Bundle-Format ein Standardformat für die Texturkomprimierung für jedes Asset-Pack auswählen. Wenn ein Gerät die anderen angegebenen Formate nicht unterstützt, werden Assets mit diesem Standardformat installiert.

Sofern Sie keine Ausrichtung auf sehr alte Gerätehardware vornehmen, ist ETC2 eine gute Wahl für ein Standardformat. Verwenden Sie stattdessen die ETC2-Formate, die garantiert in OpenGL ES 3.0 unterstützt werden. Diese Formate sind auch in der Vulkan-Grafik-API verfügbar.

Das ASTC-Format definiert verschiedene Komprimierungsblockgrößen, mit denen Sie selektiv reduzierte Bildqualität gegen eine höhere Komprimierung austauschen können. Je nach Art des Quellmotivs können Sie für eine bestimmte Textur einen kleineren oder größeren Block auswählen, um eine akzeptable visuelle Qualität beizubehalten.

Wenn Ihr Spiel Google Play Spiele für PC unterstützt und Vulkan verwendet, sollten Sie S3TC-Texturen einfügen. Die S3TC-Formate werden von allen Desktop-GPUs unterstützt.

App Bundle erstellen

Google Play verwendet Android App Bundles, um optimierte APKs für die Gerätekonfiguration der einzelnen Nutzer zu generieren und bereitzustellen. So laden Nutzer nur den Code und die Ressourcen herunter, die sie zum Ausführen des Spiels benötigen. Diese optimierten APKs enthalten eine einzelne Gruppe von Textur-Assets, die mit dem optimalen Komprimierungsformat für das Gerät formatiert sind.

Wenn Ihr Spiel nicht in Unity enthalten ist, verwenden Sie Gradle, um ein App-Bundle zu erstellen. Fortgeschrittene Nutzer möchten möglicherweise bundletool verwenden.

Wenn Ihr Spiel in Unity verwendet wird, ist die Unterstützung für App Bundles mit Play Asset Delivery ab Unity 2021.3 verfügbar. Weitere Informationen finden Sie in der Dokumentation zu Unity. Sie können ein Unity-Plug-in verwenden, um ein App-Bundle mit niedrigeren Versionen von Unity zu erstellen.

Gradle verwenden

  1. Aktualisieren Sie die Version des Android-Gradle-Plug-ins in der Datei build.gradle Ihres Projekts auf Version 4.1 oder höher (z. B. com.android.tools.build:gradle:4.1.0).

  2. Bestimmen Sie, welche Gerätetypen Sie für das Targeting Ihres Spiels verwenden möchten und welche Texturkomprimierungsformate unterstützt werden. Weitere Informationen zu Formaten finden Sie unter Hintergrund.

  3. Erstellen Sie Versionen Ihrer Assets für jedes Texturkomprimierungsformat aus dem vorherigen Schritt. Sie können Sprite Sheets mit Software wie TexturePacker generieren oder ein Script ausführen, das Roh-Assets in Assets mit einem bestimmten Format umwandelt (z. B. astc-encoder).

  4. Erstellen Sie Asset-Packs (siehe Build für C++ oder Java), die Ihre Spiel-Assets enthalten und von Play Asset Delivery verwendet werden. Du kannst beispielsweise ein Asset-Pack pro Level oder ein Asset-Pack für verschiedene Teile deines Spiels erstellen.

  5. Füge in den Asset-Packs Verzeichnisse für jedes Texturkomprimierungsformat hinzu, das unterstützt werden soll. Fügen Sie den Namen des Texturverzeichnisses unterstützte Suffixe hinzu, die dem Texturkomprimierungsformat entsprechen, das für die enthaltenen Dateien verwendet wird.

    Erstellen Sie ein Verzeichnis ohne Suffix im Namen (z. B. common/src/main/assets/textures/). Platzieren Sie in diesem Verzeichnis das Standardformat Ihrer Textur-Assets. Dieses Standardformat sollte von den meisten Geräten unterstützt werden (z. B. ETC1 oder ETC2). Wenn ein Gerät die anderen angegebenen Formate nicht unterstützt (z. B. PVRTC und ASTC in der folgenden Tabelle), installiert der Google Play Store stattdessen dieses Verzeichnis.

    Verzeichnis vorher Verzeichnis nach
    common Asset-Paket:
    Commons/build.gradle
    Commons/src/main/assets/textures/...
    common Asset-Paket:
    Commons/build.gradle
    Commons/src/main/assets/textures/...
    common/src/main/assets/textures#tcf_astc/...
    Commons/src/main/assets/textures#tcf_pvrtc/...
    level1 Asset-Pack:
    level1/build.gradle
    level1/src/main/assets/textures/...
    level1 Asset-Pack:
    level1/build.gradle
    level1/src/main/assets/textures/...
    level1/src/main/assets/textures#tcf_astc/...
    level1/src/main/assets/textures#tcf_pvrtc/...
    level2 Asset-Pack:
    level2/build.gradle
    level2/src/main/assets/textures/...
    level2 Asset-Pack:
    level2/build.gradle
    level2/src/main/assets/textures/...
    level2/src/main/assets/textures#tcf_astc/...
    level2/src/main/assets/textures#tcf_pvrtc/...
  6. Aktualisieren Sie die Datei build.gradle Ihrer Anwendung, um die Aufteilung Ihrer Asset-Packs nach Texturen zu ermöglichen.

    // In the app build.gradle file:
    android {
        ...
        bundle {
            texture {
                enableSplit true
            }
        }
    }
    
  7. Wählen Sie in Android Studio Build > Generate Signed Bundle/APK (Erstellen > Signiertes Bundle/APK generieren) aus oder starten Sie die Gradle-Task über die Befehlszeile, um Ihr Bundle zu generieren.

Google Play Unity-Plug-in verwenden

Rufen Sie das Unity-Plug-in (oder -Paket) für Play Asset Delivery ab, um ein App-Bundle mit texturbezogenen Asset-Packs zu erstellen.

Assets vorbereiten

So bereiten Sie Ihre Textur-Assets für die Erstellung eines App-Bundles vor:

  1. Fassen Sie Ihre Szene und Ihre Assets in mehrere Unity-AssetBundles zusammen.

  2. Bestimmen Sie, welche Gerätetypen Sie für das Targeting Ihres Spiels verwenden möchten und welche Texturkomprimierungsformate unterstützt werden. Weitere Informationen zu Formaten finden Sie unter Hintergrund.

  3. Ändern Sie das Build-Skript Ihres Spiels so, dass die AssetBundles mehrmals generiert werden – einmal pro Texturformat, das Sie unterstützen möchten. Hier ein Beispielskript:

    using Google.Android.AppBundle.Editor;
    using UnityEditor;
    
    public class MyBundleBuilder
    {
       [MenuItem("Assets/Build AssetBundles TCF variants")]
       public static void BuildAssetBundles()
       {
           // Describe the AssetBundles to be built:
           var assetBundlesToBuild = new []
           {
               new AssetBundleBuild
               {
                   assetBundleName = "level1-textures",
                   assetNames = new[] {"level1/character-textures", "level1/background-textures"}
               },
               new AssetBundleBuild
               {
                   assetBundleName = "level2-textures",
                   assetNames = new[] {"level2/character-textures", "level2/background-textures"}
               }
           };
    
           // Describe where to output the asset bundles and in which formats:
           var outputPath = "Assets/AssetBundles";
           var defaultTextureFormat = MobileTextureSubtarget.ETC2;
           var additionalTextureFormats = new[] { MobileTextureSubtarget.ASTC, MobileTextureSubtarget.PVRTC }
           var allowClearDirectory = true;
    
           // Generate asset bundles:
           AssetBundleBuilder.BuildAssetBundles(
               outputPath,
               assetBundlesToBuild,
               BuildAssetBundleOptions.UncompressedAssetBundle,
               defaultTextureFormat,
               additionalTextureFormats,
               allowClearDirectory);
    
           // While in this example we're using the UI to configure the
           // AssetBundles, you can use the value returned by BuildAssetBundles
           // to configure the asset packs, if you want to build the bundle
           // entirely using the scripting API.
       }
    }
    
  4. Jedes Textur-Asset muss in einem Verzeichnis mit dem richtigen Suffix im Namen ausgegeben werden (z. B. #tcf_astc).

    Prüfen Sie, ob ein Verzeichnis ohne Suffix im Namen ausgegeben wird (z. B. Assets/AssetBundles/). Dieses Verzeichnis enthält das Standardformat Ihrer Textur-Assets. Dieses Standardformat sollte von den meisten Geräten unterstützt werden (z. B. ETC2). Wenn ein Gerät die anderen angegebenen Formate nicht unterstützt (z. B. ASTC im Code aus dem vorherigen Schritt), wird dieses Verzeichnis stattdessen vom Google Play Store installiert.

    Assets/AssetBundles.meta
    Assets/AssetBundles/AssetBundles
    Assets/AssetBundles/AssetBundles.manifest
    Assets/AssetBundles/AssetBundles.manifest.meta
    Assets/AssetBundles/AssetBundles.meta
    Assets/AssetBundles/samplescene
    Assets/AssetBundles/samplescene.manifest
    Assets/AssetBundles/samplescene.manifest.meta
    Assets/AssetBundles/samplescene.meta
    Assets/AssetBundles/texturesbundle
    Assets/AssetBundles/texturesbundle.manifest
    Assets/AssetBundles/texturesbundle.manifest.meta
    Assets/AssetBundles/texturesbundle.meta
    Assets/AssetBundles#tcf_astc.meta
    Assets/AssetBundles#tcf_astc/AssetBundles
    Assets/AssetBundles#tcf_astc/AssetBundles.manifest
    Assets/AssetBundles#tcf_astc/AssetBundles.manifest.meta
    Assets/AssetBundles#tcf_astc/AssetBundles.meta
    Assets/AssetBundles#tcf_astc/samplescene
    Assets/AssetBundles#tcf_astc/samplescene.manifest
    Assets/AssetBundles#tcf_astc/samplescene.manifest.meta
    Assets/AssetBundles#tcf_astc/samplescene.meta
    Assets/AssetBundles#tcf_astc/texturesbundle
    Assets/AssetBundles#tcf_astc/texturesbundle.manifest
    Assets/AssetBundles#tcf_astc/texturesbundle.manifest.meta
    Assets/AssetBundles#tcf_astc/texturesbundle.meta
    
  5. Wählen Sie Google > Android > Asset Delivery (Google > Android > Asset Delivery) aus.

  6. Klicken Sie auf Ordner hinzufügen, um den Ordner hinzuzufügen, der Ihre Standard-Asset-Bundles enthält. Diese Bundles werden auf Geräten installiert, die die anderen von Ihnen definierten Formate nicht unterstützen.

    Legen Sie den Übermittlungsmodus für das AssetBundle fest.

    Standardformat für die Auslieferung von Unity AssetBundle

  7. Klicken Sie auf Ordner hinzufügen, um einen Ordner mit AssetBundles hinzuzufügen, die für ein anderes Format erstellt wurden (z. B. ASTC). Bei Bedarf wiederholen

    Legen Sie für jedes AssetBundle den Übermittlungsmodus fest.

    ASTC-Format für Unity AssetBundle

Eine Community

Wählen Sie Google > Android App Bundle erstellen aus, um den Unity-Build Ihres Spiels zu starten. Außerdem werden die AssetBundles in mehrere Asset-Packs gebündelt, wobei jeder AssetBundle-Name in ein einzelnes Asset-Pack konvertiert wird.

(Fortgeschritten) Bundletool verwenden

Weitere Informationen zu bundletool finden Sie unter App Bundle mit „bundletool“ erstellen.

So erstellen Sie das App Bundle:

  1. Laden Sie bundletool aus dem GitHub-Repository herunter.

  2. Bestimmen Sie, welche Gerätetypen Sie für das Targeting Ihres Spiels verwenden möchten und welche Texturkomprimierungsformate unterstützt werden. Weitere Informationen zu Formaten finden Sie unter Hintergrund.

  3. Erstellen Sie Versionen Ihrer Assets für jedes Texturkomprimierungsformat aus dem vorherigen Schritt. Sie können Sprite Sheets mit Software wie TexturePacker generieren oder ein Script ausführen, das Roh-Assets in Assets mit einem bestimmten Format umwandelt (z. B. astc-encoder).

  4. Erstellen Sie Asset-Packs (siehe Build für C++ oder Java), die Ihre Spiel-Assets enthalten und von Play Asset Delivery verwendet werden. Du kannst beispielsweise ein Asset-Pack pro Level oder ein Asset-Pack für verschiedene Teile deines Spiels erstellen.

  5. Fügen Sie den Namen des Texturverzeichnisses in den verschiedenen Asset-Packs unterstützte Suffixe hinzu, die dem Texturkomprimierungsformat entsprechen, das für die enthaltenen Dateien verwendet wird.

    Erstellen Sie ein Verzeichnis ohne Suffix im Namen (z. B. common/src/main/assets/textures/). Platzieren Sie in diesem Verzeichnis das Standardformat Ihrer Textur-Assets. Dieses Standardformat sollte von den meisten Geräten unterstützt werden (z. B. ETC1 oder ETC2). Wenn ein Gerät die anderen angegebenen Formate nicht unterstützt (z. B. PVRTC und ASTC in der folgenden Tabelle), installiert der Google Play Store stattdessen dieses Verzeichnis.

    Verzeichnis vorher Verzeichnis nach
    common Asset-Paket:
    Commons/build.gradle
    Commons/src/main/assets/textures/...
    common Asset-Paket:
    Commons/build.gradle
    Commons/src/main/assets/textures/...
    common/src/main/assets/textures#tcf_astc/...
    Commons/src/main/assets/textures#tcf_pvrtc/...
    level1 Asset-Pack:
    level1/build.gradle
    level1/src/main/assets/textures/...
    level1 Asset-Pack:
    level1/build.gradle
    level1/src/main/assets/textures/...
    level1/src/main/assets/textures#tcf_astc/...
    level1/src/main/assets/textures#tcf_pvrtc/...
    level2 Asset-Pack:
    level2/build.gradle
    level2/src/main/assets/textures/...
    level2 Asset-Pack:
    level2/build.gradle
    level2/src/main/assets/textures/...
    level2/src/main/assets/textures#tcf_astc/...
    level2/src/main/assets/textures#tcf_pvrtc/...
  6. Fügen Sie der Metadatendatei des App-Bundles (BundleConfig.json) die TCF-Dimension hinzu. Verwenden Sie TEXTURE_COMPRESSION_FORMAT für das Feld value:

    {
      ...
      "optimizations": {
        "splitsConfig": {
          "splitDimension": [
          ...
          {
             "value": "TEXTURE_COMPRESSION_FORMAT",
             "negate": false,
             "suffixStripping": {
               "enabled": true,
               "defaultSuffix": ""
              }
          }],
        }
      }
    }
    

    Legen Sie suffixStripping.enabled auf true fest, um beim Generieren der Asset-Packs das Suffix (z. B. #tcf_astc) aus den Verzeichnisnamen zu entfernen. Dadurch kann dein Spiel Dateien aus einem bekannten Verzeichnisnamen wie level1/assets/textures lesen. Einige Spiel-Engines können das Format einer Datei erkennen. Daher kann es sein, dass dein Spiel das Format der Textur-Assets, mit denen es installiert wurde, nicht unterscheidet.

    suffixStripping.defaultSuffix gibt das Standardverzeichnissuffix an, wenn bundletool ein eigenständiges APK für Geräte mit Android 5.0 (API-Ebene 21) und niedriger generiert. In der Beispieltabelle oben ist die Standardversion der Textur-Assets auf diesen Geräten installiert. Das ist in den meisten Fällen das beabsichtigte Verhalten.

  7. Erstellen Sie das App Bundle:

    bundletool build-bundle --config=BUILD_CONFIG.json \
      --modules=level1.zip,level2.zip,common.zip,base.zip --output=MY_BUNDLE.aab
    

Inhalt des App Bundles prüfen

Falls noch nicht geschehen, laden Sie bundletool aus dem GitHub-Repository herunter.

Prüfen Sie den Inhalt des Ausgabe-App-Bundles, indem Sie APKs daraus erstellen und untersuchen:

bundletool build-apks --output=APKS.apks --bundle=MY_BUNDLE.aab
zipinfo APKS.apks

Die Ausgabe sollte in etwa so aussehen:

toc.pb
splits/base-master.apk
splits/base-armeabi_v7a.apk
splits/…
asset-slices/level1-astc.apk
asset-slices/level1-other_tcf.apk
asset-slices/level1-pvrtc.apk

Diese Namen weisen darauf hin, dass das TCF-Targeting korrekt angewendet wird. Wenn Sie den Inhalt eines Level-APKs wie asset-slices/level1-astc.apk extrahieren, können Sie prüfen, ob nur ein Verzeichnis namens textures vorhanden ist.

App Bundle testen

Schließen Sie ein Gerät an und installieren Sie die entsprechenden Asset-Packs:

bundletool install-apks --apks=APKS.apks

Mit diesem Befehl werden nur die Asset-Packs installiert, die der Gerätespezifikation entsprechen. Diese Spezifikationen umfassen ABI, Bildschirmdichte, Sprache und das am besten geeignete Texturkomprimierungsformat. Dieser Vorgang simuliert, was der Google Play Store für dein veröffentlichtes Spiel ausführt.

So überprüfen Sie, ob die richtigen Asset-Packs installiert wurden:

  • Geben Sie mit dem Befehl bundletool extract-apks die für Ihr Gerät installierten APK-Dateien in ein Verzeichnis aus, und prüfen Sie dann dieses Verzeichnis.

    1. Extrahieren Sie die Spezifikation Ihres Geräts:

      bundletool get-device-spec --output=MY_DEVICE_SPEC.json
      
    2. Führen Sie bundletool extract-apks mit dieser Gerätespezifikation aus:

      bundletool extract-apks --apks=APKS.apks --device-spec=MY_DEVICE_SPEC.json \
          --output-dir out
      
    3. Listen Sie die Dateien im Verzeichnis out auf und prüfen Sie, ob die richtigen Asset-Packs installiert sind. An die Namen der Asset-Packs wird der Name des Texturformats angehängt (z. B. level1-astc.apk).

  • Fügen Sie Ihrem Spiel Log-Anweisungen hinzu, die beim Laden einer Textur das Texturformat ausgeben.

  • Generieren Sie einen Testsatz von Texturen. Ersetzen Sie beispielsweise eine Textur durch eine einzelne helle Farbe für ein bestimmtes Format. Führen Sie das Spiel aus und überprüfen Sie, ob es vorhanden ist.

Wenn Ihre Anwendung on-demand- oder fast-follow-Asset-Packs enthält, verwenden Sie die lokale Testlösung für die Asset-Bereitstellung.

Unterstützte Suffixe für Namen von Texturverzeichnissen

Google Play versteht die folgenden Suffixe, die in Texturverzeichnisnamen verwendet werden:

  • #tcf_astc für Adaptive Scaling Texture Compression (ASTC)
  • #tcf_atc für ATI-Texturkomprimierung (ATC)
  • #tcf_dxt1 für S3 DXT1-Texturkomprimierung (DXT1)
  • #tcf_latc für Luminance-Alpha-Texturkomprimierung (LATC)
  • #tcf_paletted für allgemeine Texturkomprimierung unter Paletten
  • #tcf_pvrtc für PowerVR-Texturkomprimierung (PVRTC)
  • #tcf_etc1 für Ericsson-Texturkomprimierung (ETC1)
  • #tcf_etc2 für Ericsson-Texturkomprimierung 2 (ETC2)
  • #tcf_s3tc für S3-Texturkomprimierung (S3TC)
  • #tcf_3dc für ATI 3Dc-Texturkomprimierung (3Dc)

Google Play-Auslieferungsregeln

Google Play prüft die vom Gerät verwendeten OpenGL-Erweiterungsstrings und die vom Gerät unterstützte OpenGL-Version. Google Play verwendet diese Informationen, um das richtige Texturformat zu bestimmen, das aus dem Android App Bundle an das Gerät gesendet werden soll.

Google Play liefert das erste Format, das vom Gerät unterstützt wird. Die Reihenfolge findest du in der folgenden Tabelle:

Wenn keines der Texturformate im App Bundle vom Gerät unterstützt wird, stellt Google Play die im Standardformat verpackten Texturformate bereit. Sofern Ihre Anzeigen nicht auf eine bestimmte Gerätehardware ausgerichtet sind, sind ETC1 oder ETC2 gute Wahl für ein Standardformat. Informationen zum Verpacken von Assets im Standardformat finden Sie unter Bundletool verwenden oder Google Play Unity-Plug-in verwenden.

Wenn Assets nicht in einem Standardformat verpackt wurden, markiert Google Play die App als nicht für das Gerät verfügbar. In diesem Fall können Nutzer die App nicht herunterladen.

Format (in tcf_xxxx gekennzeichnet) Wird auf Geräten mit OpenGL-Erweiterungsstring unterstützt,
ASTC GL_KHR_texture_compression_astc_ldr
PVR GL_IMG_texture_compression_pvrtc
S3TC GL_EXT_texture_compression_s3tc
DXT1 GL_EXT_texture_compression_dxt1
Latc GL_EXT_texture_compression_latc
atc GL_AMD_compressed_ATC_texture
3D GL_AMD_compressed_3DC_texture
etc2 Nicht zutreffend Das Gerät muss OpenGL ES-Version 3.0 oder höher unterstützen.
etc1 GL_OES_compressed_ETC1_RGB8_texture
farbig GL_OES_compressed_paletted_texture