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 wie sie in Android App Bundles verwendet werden. Lesen Sie die Artikel 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 (Texture Compression Format, TCF) ist ein Dateiformat, das für GPUs optimiert ist. Die GPU lädt und rendert eine Textur schneller und mit weniger Arbeitsspeicher, als wenn sie ein Array von RGBA-Werten im Arbeitsspeicher verwenden würde. Diese Unterstützung erfolgt auf Hardwareebene: Der GPU-Hersteller bettet Komponenten in den Grafikkartenchip ein, die die unterstützten Formate lesen, dekomprimieren und rendern.

Im Folgenden sind gängige Texturkomprimierungsformate auf moderner mobiler Hardware aufgeführt:

  • ASTC: Ein neueres Format, das ältere Formate ersetzen soll. Flexibler als frühere Formate, da verschiedene Blockgrößen unterstützt werden. Mit diesem Format können Sie die Größe Ihres Spiels 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
ASTC > 80 %
ETC2 > 95 %

GPUs von Computern, auf denen Google Play Games für PC ausgeführt wird, unterstützen auch dieses Format:

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

Ältere, nicht mehr empfohlene Texturkomprimierungsformate sind:

  • 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 auch auf einigen Android-Geräten unterstützt.

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

Ein Standardformat

Bei so vielen verfügbaren Formaten (mit unterschiedlicher Geräteunterstützung) weißt du möglicherweise nicht, welche Formate du beim Erstellen deiner Spieltexturen verwenden sollst. Als Sicherheitsmaßnahme können Sie im App-Bundle-Format für jedes Asset-Paket ein Standardformat für die Texturkomprimierung auswählen. Wenn ein Gerät die anderen angegebenen Formate nicht unterstützt, werden Assets mit diesem Standardformat installiert.

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

Das ASTC-Format definiert eine Vielzahl von Komprimierungsblockgrößen, mit denen Sie selektiv eine geringere Bildqualität gegen eine höhere Komprimierung eintauschen können. Je nach Art des Ausgangsmaterials können Sie für eine bestimmte Textur eine kleinere oder größere Blockgröße wählen, um eine akzeptable visuelle Qualität zu erzielen.

Wenn dein Spiel Google Play Games für PC unterstützt und Vulkan verwendet, solltest du S3TC-Texturen einbinden. 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 deines Spiels benötigen. Diese optimierten APKs enthalten einen einzelnen Satz von Textur-Assets, die mit dem optimalen Komprimierungsformat für das Gerät formatiert sind.

Wenn Ihr Spiel nicht in Unity erstellt wurde, verwenden Sie Gradle, um ein App-Bundle zu erstellen. Fortgeschrittene Nutzer können bundletool verwenden.

Wenn Ihr Spiel in Unity entwickelt wurde, werden App-Bundles mit Play Asset Delivery in Unity 2021.3 und höher unterstützt. Weitere Informationen finden Sie in der Unity-Dokumentation. Sie können ein Unity-Plug-in verwenden, um ein App-Bundle mit älteren Unity-Versionen zu erstellen.

Gradle verwenden

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

  2. Bestimme die Gerätetypen, auf die du dein Spiel ausrichten möchtest, und die von ihnen unterstützten Texturkomprimierungsformate. Weitere Informationen zu Formaten findest du unter Hintergrund.

  3. Erstelle Versionen deiner Assets für jedes Texturkomprimierungsformat aus dem vorherigen Schritt. Dazu gehört beispielsweise das Generieren von Sprite-Sheets mit Software wie TexturePacker oder das Ausführen eines Skripts, das Roh-Assets in ein bestimmtes Format konvertiert (z. B. astc-encoder).

  4. Erstelle Asset-Packs (siehe Für C++ oder Java entwickeln), die deine Spiel-Assets enthalten und von Play Asset Delivery verwendet werden. Sie können beispielsweise ein Asset-Paket pro Level oder Asset-Pakete für verschiedene Teile Ihres Spiels erstellen.

  5. Fügen Sie in Ihren Asset-Packs Verzeichnisse für jedes Texturkomprimierungsformat hinzu, das Sie unterstützen möchten. Füge den Namen der Texturverzeichnisse unterstützte Suffixe hinzu, die dem Texturkomprimierungsformat der enthaltenen Dateien entsprechen.

    Erstellen Sie ein Verzeichnis ohne Suffix im Namen (z. B. common/src/main/assets/textures/). Legen Sie in diesem Verzeichnis das Standardformat Ihrer Textur-Assets ab. 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 Tabelle unten), installiert der Google Play Store stattdessen dieses Verzeichnis.

    Verzeichnis vor Verzeichnis nach
    common Asset-Paket:
    common/build.gradle
    common/src/main/assets/textures/...
    common Asset-Paket:
    common/build.gradle
    common/src/main/assets/textures/...
    common/src/main/assets/textures#tcf_astc/...
    common/src/main/assets/textures#tcf_pvrtc/...
    level1 Asset-Paket:
    level1/build.gradle
    level1/src/main/assets/textures/...
    level1 Asset-Paket:
    level1/build.gradle
    level1/src/main/assets/textures/...
    level1/src/main/assets/textures#tcf_astc/...
    level1/src/main/assets/textures#tcf_pvrtc/...
    level2 Asset-Paket:
    level2/build.gradle
    level2/src/main/assets/textures/...
    level2 Asset-Paket:
    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 App, um die Aufteilung Ihrer Asset-Packs nach Texturen zu aktivieren.

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

Google Play Unity-Plug-in verwenden

Laden Sie das Unity-Plug-in (oder ‑Paket) für Play Asset Delivery herunter, um ein App-Bundle mit Asset-Packs zu erstellen, die auf Texturen ausgerichtet sind.

Assets vorbereiten

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

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

  2. Bestimme die Gerätetypen, auf die du dein Spiel ausrichten möchtest, und die von ihnen unterstützten Texturkomprimierungsformate. Weitere Informationen zu Formaten findest du unter Hintergrund.

  3. Ändere das Build-Skript deines Spiels, um die AssetBundles mehrmals zu generieren – einmal für jedes Texturformat, das du unterstützen möchtest. Sehen Sie sich folgendes Beispielskript an:

    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. Prüfen Sie, ob jedes Textur-Asset in einem Verzeichnis mit dem richtigen Suffix im Namen ausgegeben wird (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), installiert der Google Play Store stattdessen dieses Verzeichnis.

    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 > Assets Delivery aus.

  6. Klicken Sie auf Ordner hinzufügen, um den Ordner mit Ihren Standard-Asset-Bundles hinzuzufügen. Diese Bundles werden auf Geräten installiert, die die anderen von dir definierten Formate nicht unterstützen.

    Achten Sie darauf, den Bereitstellungsmodus für das AssetBundle festzulegen.

    Standardformat für die Bereitstellung von Unity-AssetBundles

  7. Klicke auf Ordner hinzufügen, um einen Ordner mit AssetBundles hinzuzufügen, die für ein anderes Format (z. B. ASTC) erstellt wurden. Wiederholen Sie diese Schritte für alle Suchabfragen, für die dies erforderlich ist.

    Achten Sie darauf, den Bereitstellungsmodus für jedes AssetBundle festzulegen.

    Unity AssetBundle-Bereitstellung im ASTC-Format

Build

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

(Erweitert) 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. Bestimme die Gerätetypen, auf die du dein Spiel ausrichten möchtest, und die von ihnen unterstützten Texturkomprimierungsformate. Weitere Informationen zu Formaten findest du unter Hintergrund.

  3. Erstelle Versionen deiner Assets für jedes Texturkomprimierungsformat aus dem vorherigen Schritt. Dazu gehört beispielsweise das Generieren von Sprite-Sheets mit Software wie TexturePacker oder das Ausführen eines Skripts, das Roh-Assets in ein bestimmtes Format konvertiert (z. B. astc-encoder).

  4. Erstelle Asset-Packs (siehe Für C++ oder Java erstellen), die deine Spiel-Assets enthalten und von Play Asset Delivery verwendet werden. Sie können beispielsweise ein Asset-Paket pro Level oder Asset-Pakete für verschiedene Teile Ihres Spiels erstellen.

  5. Fügen Sie in Ihren verschiedenen Asset-Packs den Namen der Texturverzeichnisse unterstützte Suffixe hinzu, die dem Texturkomprimierungsformat der enthaltenen Dateien entsprechen.

    Erstellen Sie ein Verzeichnis ohne Suffix im Namen (z. B. common/src/main/assets/textures/). Legen Sie in diesem Verzeichnis das Standardformat Ihrer Textur-Assets ab. 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 Tabelle unten), installiert der Google Play Store stattdessen dieses Verzeichnis.

    Verzeichnis vor Verzeichnis nach
    common Asset-Paket:
    common/build.gradle
    common/src/main/assets/textures/...
    common Asset-Paket:
    common/build.gradle
    common/src/main/assets/textures/...
    common/src/main/assets/textures#tcf_astc/...
    common/src/main/assets/textures#tcf_pvrtc/...
    level1 Asset-Paket:
    level1/build.gradle
    level1/src/main/assets/textures/...
    level1 Asset-Paket:
    level1/build.gradle
    level1/src/main/assets/textures/...
    level1/src/main/assets/textures#tcf_astc/...
    level1/src/main/assets/textures#tcf_pvrtc/...
    level2 Asset-Paket:
    level2/build.gradle
    level2/src/main/assets/textures/...
    level2 Asset-Paket:
    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 die TCF-Dimension zur Metadatendatei des App-Bundles (BundleConfig.json) hinzu. Verwenden Sie TEXTURE_COMPRESSION_FORMAT für das Feld value:

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

    Setzen Sie suffixStripping.enabled auf true, um das Suffix (z. B. #tcf_astc) beim Generieren der Asset-Packs aus den Verzeichnisnamen zu entfernen. Dadurch kann dein Spiel Dateien aus einem bekannten Verzeichnisnamen (z. B. level1/assets/textures) lesen. Einige Spiele-Engines können das Format einer Datei erkennen, sodass das Format der Textur-Assets, mit denen das Spiel installiert wurde, keine Rolle spielt.

    suffixStripping.defaultSuffix gibt das Standardverzeichnissuffix an, wenn bundletool ein eigenständiges APK für Geräte mit Android 5.0 (API-Level 21) und niedriger generiert. In der obigen Beispieltabelle 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 diese prüfen:

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 richtig angewendet wird. Wenn Sie den Inhalt eines Level-APKs extrahieren (z. B. asset-slices/level1-astc.apk), können Sie prüfen, ob nur ein Verzeichnis mit dem Namen textures vorhanden ist.

App-Bundle testen

Verbinden Sie ein Gerät und installieren Sie die entsprechenden Asset-Packs:

bundletool install-apks --apks=APKS.apks

Mit diesem Befehl werden nur die Asset-Packs installiert, die den Spezifikationen des Geräts entsprechen. Diese Spezifikationen umfassen ABI, Pixeldichte, Sprache und das am besten geeignete Texturkomprimierungsformat. Dieser Vorgang simuliert, was der Google Play Store für Ihr veröffentlichtes Spiel tut.

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

  • Verwenden Sie den Befehl bundletool extract-apks, um die für Ihr Gerät installierten APKs in ein Verzeichnis auszugeben, 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 in Ihrem Spiel Logberichte hinzu, die das Texturformat beim Laden einer Textur ausgeben.

  • Generieren Sie einen Testsatz von Texturen (z. B. ersetzen Sie eine Textur durch eine einzelne helle Farbe für ein bestimmtes Format). Führen Sie das Spiel aus und prüfen Sie, ob es vorhanden ist.

Wenn Ihre App 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 Texturverzeichnisnamen

Google Play erkennt die folgenden Suffixe, die in den Namen von Texturverzeichnissen verwendet werden:

  • #tcf_astc für Adaptive Scalable Texture Compression (ASTC)
  • #tcf_atc für ATI-Texturkomprimierung (ATC)
  • #tcf_dxt1 für S3 DXT1-Texturkomprimierung (DXT1)
  • #tcf_latc für Luminanz-Alpha-Texturkomprimierung (LATC)
  • #tcf_paletted für die generische palettenbasierte Texturkomprimierung
  • #tcf_pvrtc für PowerVR-Texturkomprimierung (PVRTC)
  • #tcf_etc1 für Ericsson Texture Compression (ETC1)
  • #tcf_etc2 für Ericsson Texture Compression 2 (ETC2)
  • #tcf_s3tc für S3-Texturkomprimierung (S3TC)
  • #tcf_3dc für ATI 3Dc-Texturkomprimierung (3Dc)

Google Play-Bereitstellungsregeln

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 vom Android App Bundle an das Gerät gesendet werden soll.

Google Play liefert das erste Format, das vom Gerät unterstützt wird, in der in der folgenden Tabelle aufgeführten Reihenfolge.

Wenn keines der Texturformate im App Bundle vom Gerät unterstützt wird, liefert Google Play die Texturformate im Standardformat. (Wenn Sie nicht auf bestimmte Gerätehardware abzielen, sind ETC1 oder ETC2 eine gute Wahl für ein Standardformat.) Informationen zum Packen von Assets im Standardformat finden Sie unter bundletool verwenden oder Google Play Unity-Plug-in verwenden.

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

Format (in tcf_xxxx angegeben) Unterstützt auf Geräten mit OpenGL-Erweiterungsstring
astc GL_KHR_texture_compression_astc_ldr
pvrtc 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
3dc 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
paletted GL_OES_compressed_paletted_texture