Zieltexturkomprimierungsformate in Android App Bundles

Texturen sind Bilder, die auf die Oberfläche eines 3D-Modells angewendet werden können. Strukturen 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, sie in Android App Bundles ausrichten. Gelesen Android App Bundles und Play Asset Delivery, bevor du dies startest .

Hintergrund

GPUs unterstützen in der Regel eine Reihe von Texturkomprimierungsformaten. A Das Texturkomprimierungsformat (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 im Speicher ein Array von RGBA-Werten. Diese Unterstützung erfolgt am Hardwareebene: Der GPU-Hersteller bettet Komponenten in die Grafikkarten ein. Chip, der die unterstützten Formate liest, dekomprimiert und rendert.

Die folgenden Formate sind gängige Texturkomprimierungsformate auf moderner mobiler Hardware:

  • ASTC: Kürzliches Format, das frühere Formate ersetzt. Flexibler als vorherigen Formaten, da sie verschiedene Blockgrößen unterstützen. Verwendung dieses Formats ist eine gute Möglichkeit, die Größe deines Spiels zu 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 für Android unterstützt Geräte:

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

GPUs von Desktop-Computern, auf denen Google Play Spiele für PC ausgeführt wird, unterstützen ebenfalls dieses Format:

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

Zu den älteren, nicht mehr empfohlenen Formaten zur Texturkomprimierung gehören:

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

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

Ein Standardformat

Bei so vielen verfügbaren Formaten (mit unterschiedlicher Geräteunterstützung) wissen möglicherweise nicht, welche Formate sie bei der Erstellung der Texturen für Ihr Spiel verwenden sollen. Als können Sie mit dem App Bundle-Format eine standardmäßige Texturkomprimierung auswählen, Format für jedes Asset-Pack an. Wenn ein Gerät die anderen angegebenen werden Assets mit diesem Standardformat installiert.

Sofern Sie nicht auf sehr alte Gerätehardware abzielen, ist ETC2 eine gute Wahl. für ein Standardformat. Sie sollten ETC2-Formate verwenden, die garantiert unter OpenGL ES 3.0 unterstützt. Diese Formate sind auch in der Vulkan Graphics API verfügbar.

Das ASTC-Format definiert eine Vielzahl von Komprimierungsblockgrößen, selektiv reduzierte Bildqualität gegen bessere Komprimierung eintauschen. Je nach Art des Quell-Art-Materials können Sie für eine bestimmte Textur Wählen Sie einen kleineren oder größeren Block aus, um eine akzeptable visuelle Qualität beizubehalten.

Wenn dein Spiel Google Play Spiele für PC unterstützt und Vulkan verwendet, hast du folgende Möglichkeiten: sollten S3TC-Texturen enthalten. Die S3TC-Formate werden von allen Desktop-GPUs.

App Bundle erstellen

Google Play verwendet Android App Bundles, um optimierte APKs für die Gerätekonfiguration jedes Nutzers, sodass die Nutzer nur den Code und die Ressourcen herunterladen die sie für Ihr Spiel benötigen. Diese optimierten APKs enthalten einen einzelnen Satz Texturen. -Assets, die mit dem für das Gerät optimalen Komprimierungsformat formatiert sind.

Wenn Sie für Ihr Spiel nicht Unity verwenden, verwenden Sie Gradle, um ein App Bundle zu erstellen. Fortgeschrittene Nutzer können bundletool verwenden.

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

Gradle verwenden

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

  2. Legen Sie die Gerätetypen fest, auf die Sie Ihr Spiel ausrichten möchten, und unterstützte Texturkomprimierungsformate (weitere Informationen (siehe Hintergrund).

  3. Erstellen Sie Versionen Ihrer Assets für jedes Texturkomprimierungsformat aus dem vorherigen Schritt. Dies könnte das Generieren von Sprite Sheets mithilfe von Software beinhalten „Mag ich“-Bewertung TexturePacker oder Ausführung eines Skripts, das Rohassets in Assets mit einem bestimmten Format umwandelt (z. B. astc-encoder).

  4. Erstellen Sie Asset-Packs (siehe Build for C++ or Java), die deine Spiel-Assets enthalten und von Play Asset Delivery verwendet werden. Für können Sie z. B. ein Asset-Pack pro Level oder verschiedene Bereiche Ihres Spiels.

  5. Fügen Sie den Asset-Packs Verzeichnisse für jedes Texturkomprimierungsformat hinzu die Sie unterstützen möchten. Fügen Sie unterstützte Suffixe hinzu: die Namen der Texturverzeichnisse, die der Texturkomprimierung entsprechen -Format, 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 Format Ihrer Textur-Assets. Dieses Standardformat sollte von auf den meisten Geräten (z. B. ETC1 oder ETC2). Wenn ein Gerät den Parameter anderen angegebenen Formaten (z. B. PVRTC und ASTC in der Tabelle unten) wird dieses Verzeichnis stattdessen vom Google Play Store installiert.

    Verzeichnis vor dem Verzeichnis nach dem
    common Asset-Pack:
    Common/build.gradle
    Common/src/main/assets/textures/...
    common Asset-Pack:
    Common/build.gradle
    Common/src/main/assets/textures/...
    common/src/main/assets/textures#tcf_astc/...
    Common/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. Aktualisiere die build.gradle-Datei deiner App, um die Aufteilung deiner Asset-Packs pro Texturen.

    // In the app build.gradle file:
    android {
        ...
        bundle {
            texture {
                enableSplit true
            }
        }
    }
    
  7. Wählen Sie in Android Studio Build > Signiertes Bundle / APK generieren oder starte die Gradle-Task über die Befehlszeile das Bundle erstellen.

Google Play Unity-Plug-in verwenden

Unity-Plug-in (oder -Paket) für Play Asset Delivery herunterladen 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. Szene und Assets in mehreren Einheiten zusammenfassen Asset-Bundles:

  2. Legen Sie die Gerätetypen fest, auf die Sie Ihr Spiel ausrichten möchten, und unterstützte Texturkomprimierungsformate (weitere Informationen (siehe Hintergrund).

  3. Das Build-Skript deines Spiels ändern, um mehrere AssetBundles zu generieren einmal für jedes Texturformat, das unterstützt werden soll. Weitere Informationen finden Sie in der folgendes 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. Stellen Sie sicher, dass jedes Textur-Asset in einem Verzeichnis mit der korrekten Suffix im Namen enthalten (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 Ihres Textur-Assets. Dieses Standardformat sollte von den meisten Geräten (für z. B. ETC2). Wenn ein Gerät die anderen angegebenen Formate nicht unterstützt (z. B. ASTC im Code des vorherigen Schritts) enthält, wird der Link Store installiert 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 > Asset Delivery

  6. Klicken Sie auf Ordner hinzufügen, um den Ordner mit dem Standard-Asset hinzuzufügen. Sets. Diese Bundles werden auf Geräten installiert, die die anderen die von Ihnen definierten Formaten.

    Für das AssetBundle muss der Übermittlungsmodus festgelegt sein.

    Standardformat für die Auslieferung von Unity AssetBundle-Lieferungen

  7. Klicken Sie auf Ordner hinzufügen, um einen Ordner hinzuzufügen, der Asset-Bundles enthält, die für ein anderes Format verwenden (z. B. ASTC). Bei Bedarf wiederholen

    Für jedes AssetBundle muss der Übermittlungsmodus festgelegt werden.

    Unity AssetBundle-Lieferung ASTC-Format

Eine Community

Wählen Sie Google > Erstelle ein Android App Bundle, um den Unity-Build deiner Spiel. Außerdem werden die Asset-Bundles in mehrere Asset-Packs gebündelt, in denen jedes Der Name des Asset-Bundles wurde in ein einzelnes Asset-Pack umgewandelt.

(Fortgeschritten) Bundletool verwenden

Weitere Informationen zu bundletool finden Sie unter Erstelle ein App Bundle mit Bundletool.

So erstellen Sie das App Bundle:

  1. bundletool herunterladen aus seinem GitHub-Repository.

  2. Legen Sie die Gerätetypen fest, auf die Sie Ihr Spiel ausrichten möchten, und unterstützte Texturkomprimierungsformate (weitere Informationen (siehe Hintergrund).

  3. Erstellen Sie Versionen Ihrer Assets für jedes Texturkomprimierungsformat aus dem vorherigen Schritt. Dies könnte das Generieren von Sprite Sheets mithilfe von Software beinhalten „Mag ich“-Bewertung TexturePacker oder Ausführung eines Skripts, das Rohassets in Assets mit einem bestimmten Format umwandelt (Beispiel: astc-encoder).

  4. Erstellen Sie Asset-Packs (siehe Build for C++ or Java), die deine Spiel-Assets enthalten und von Play Asset Delivery verwendet werden. Für können Sie z. B. ein Asset-Pack pro Level oder verschiedene Bereiche Ihres Spiels.

  5. Füge den verschiedenen Asset-Packs unterstützte Suffixe hinzu. den Namen der Texturverzeichnisse, die der Texturkomprimierung entsprechen -Format, 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 Format Ihrer Textur-Assets. Dieses Standardformat sollte von auf den meisten Geräten (z. B. ETC1 oder ETC2). Wenn ein Gerät den Parameter anderen angegebenen Formaten (z. B. PVRTC und ASTC in der Tabelle unten) wird dieses Verzeichnis stattdessen vom Google Play Store installiert.

    Verzeichnis vor dem Verzeichnis nach dem
    common Asset-Pack:
    Common/build.gradle
    Common/src/main/assets/textures/...
    common Asset-Pack:
    Common/build.gradle
    Common/src/main/assets/textures/...
    common/src/main/assets/textures#tcf_astc/...
    Common/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 die Dimension „TCF“ dem Metadatendatei des App-Bundles (BundleConfig.json) TEXTURE_COMPRESSION_FORMAT für value verwenden ein:

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

    Legen Sie suffixStripping.enabled auf true fest, um das Suffix zu entfernen (z. B. #tcf_astc) beim Generieren der Asset-Packs aus den Verzeichnisnamen. Dieses ermöglicht es deinem Spiel, Dateien aus einem bekannten Verzeichnisnamen (z. B. level1/assets/textures. Einige Spiel-Engines erkennen das Format eines Datei, sodass Ihr Spiel unabhängig vom Format der Textur-Assets ist, mit dem sie installiert wurde.

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

  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, bundletool herunterladen aus dem GitHub-Repository.

Überprüfe den Inhalt des Ausgabe-App-Bundles, indem du APKs daraus erstellst und bei der Überprüfung:

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. Beim Extrahieren des Inhalts eines APK mit Level (z. B. asset-slices/level1-astc.apk) kann überprüfen, ob nur ein Verzeichnis namens textures vorhanden ist.

App Bundle testen

Gerät verbinden und die entsprechenden Asset-Packs installieren:

bundletool install-apks --apks=APKS.apks

Mit diesem Befehl werden nur die Asset-Packs installiert, die der Gerätespezifikation entsprechen. Zu diesen Spezifikationen gehören ABI, Bildschirmdichte, Sprache und anwendbares Texturkomprimierungsformat. Dieser Vorgang simuliert, was Google Play Store für Ihr veröffentlichtes Spiel nach.

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

  • Geben Sie mit dem Befehl bundletool extract-apks die für auf Ihrem Gerät in einem Verzeichnis speichern und dann dieses Verzeichnis prüfen.

    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 vorhanden sind. installiert sind. An die Namen von Asset-Packs wird der Name des Texturformats angehängt (für Beispiel: level1-astc.apk).

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

  • Generieren Sie einen Testsatz von Texturen. Ersetzen Sie beispielsweise eine Textur durch eine einzelne leuchtende Farbe für ein bestimmtes Format). Starten Sie das Spiel und prüfen Sie, ob es vorhanden ist.

Wenn deine App Asset-Packs on-demand oder fast-follow enthält, verwende das lokale Testlösung für Asset Delivery

Unterstützte Suffixe für Texturverzeichnisnamen

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

  • #tcf_astc für adaptive skalierbare Texturkomprimierung (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 die allgemeine Komprimierung von Texturen in Farbpaletten
  • #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-Bereitstellungsregeln

Google Play prüft die vom Gerät verwendeten OpenGL-Erweiterungsstrings sowie die Vom Gerät unterstützte OpenGL-Version. Google Play nutzt diese Informationen, um das richtige Texturformat zu bestimmen, das vom Android-Gerät App Bundle aus.

Google Play stellt das erste Format in der nachfolgend aufgeführten Reihenfolge bereit. die vom Gerät unterstützt wird.

Wenn keines der Texturformate im App Bundle vom Gerät unterstützt wird, Google Play stellt die Texturformate im Standardformat bereit. (Sofern Sie nicht auf spezifische Gerätehardware ausgerichtet sind, sind ETC1 oder ETC2 ausreichend. Auswahlmöglichkeiten für ein Standardformat.) Informationen zum Verpacken von Assets finden Sie in der Standardformat, siehe Bundletool verwenden oder Google Play Unity-Plug-in verwenden

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

Format (festgelegt in tcf_xxxx) Unterstützt auf Geräten mit OpenGL Erweiterungsstring
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
3 D GL_AMD_compressed_3DC_texture
usw2 Nicht zutreffend Das Gerät muss die OpenGL ES-Version 3.0 oder .
usw.1 GL_OES_compressed_ETC1_RGB8_texture
palette GL_OES_compressed_paletted_texture