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.
Empfohlene Formate
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
Aktualisieren Sie die Version des Android-Gradle-Plug-ins in der Datei
build.gradleIhres Projekts auf 4.1 oder höher (z. B.com.android.tools.build:gradle:4.1.0).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.
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).
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.
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 commonAsset-Paket:
common/build.gradle
common/src/main/assets/textures/...commonAsset-Paket:
common/build.gradle
common/src/main/assets/textures/...
common/src/main/assets/textures#tcf_astc/...
common/src/main/assets/textures#tcf_pvrtc/...level1Asset-Paket:
level1/build.gradle
level1/src/main/assets/textures/...level1Asset-Paket:
level1/build.gradle
level1/src/main/assets/textures/...
level1/src/main/assets/textures#tcf_astc/...
level1/src/main/assets/textures#tcf_pvrtc/...level2Asset-Paket:
level2/build.gradle
level2/src/main/assets/textures/...level2Asset-Paket:
level2/build.gradle
level2/src/main/assets/textures/...
level2/src/main/assets/textures#tcf_astc/...
level2/src/main/assets/textures#tcf_pvrtc/...Aktualisieren Sie die Datei
build.gradleIhrer App, um die Aufteilung Ihrer Asset-Packs nach Texturen zu aktivieren.// In the app build.gradle file: android { ... bundle { texture { enableSplit true } } }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:
Verpacken Sie Ihre Szene und Assets in mehrere Unity-AssetBundles.
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.
Ä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. } }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.metaWählen Sie Google > Android > Assets Delivery aus.
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.
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.
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:
Laden Sie
bundletoolaus dem GitHub-Repository herunter.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.
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).
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.
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 commonAsset-Paket:
common/build.gradle
common/src/main/assets/textures/...commonAsset-Paket:
common/build.gradle
common/src/main/assets/textures/...
common/src/main/assets/textures#tcf_astc/...
common/src/main/assets/textures#tcf_pvrtc/...level1Asset-Paket:
level1/build.gradle
level1/src/main/assets/textures/...level1Asset-Paket:
level1/build.gradle
level1/src/main/assets/textures/...
level1/src/main/assets/textures#tcf_astc/...
level1/src/main/assets/textures#tcf_pvrtc/...level2Asset-Paket:
level2/build.gradle
level2/src/main/assets/textures/...level2Asset-Paket:
level2/build.gradle
level2/src/main/assets/textures/...
level2/src/main/assets/textures#tcf_astc/...
level2/src/main/assets/textures#tcf_pvrtc/...Fügen Sie die TCF-Dimension zur Metadatendatei des App-Bundles (
BundleConfig.json) hinzu. Verwenden SieTEXTURE_COMPRESSION_FORMATfür das Feldvalue:{ ... "optimizations": { "splitsConfig": { "splitDimension": [ ... { "value": "TEXTURE_COMPRESSION_FORMAT", "negate": false, "suffixStripping": { "enabled": true, "defaultSuffix": "" } }], } } }
Setzen Sie
suffixStripping.enabledauftrue, 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.defaultSuffixgibt das Standardverzeichnissuffix an, wennbundletoolein 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.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.Extrahieren Sie die Spezifikation Ihres Geräts:
bundletool get-device-spec --output=MY_DEVICE_SPEC.jsonFühren Sie
bundletool extract-apksmit dieser Gerätespezifikation aus:bundletool extract-apks --apks=APKS.apks --device-spec=MY_DEVICE_SPEC.json \ --output-dir outListen Sie die Dateien im Verzeichnis
outauf 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_astcfür Adaptive Scalable Texture Compression (ASTC)#tcf_atcfür ATI-Texturkomprimierung (ATC)#tcf_dxt1für S3 DXT1-Texturkomprimierung (DXT1)#tcf_latcfür Luminanz-Alpha-Texturkomprimierung (LATC)#tcf_palettedfür die generische palettenbasierte Texturkomprimierung#tcf_pvrtcfür PowerVR-Texturkomprimierung (PVRTC)#tcf_etc1für Ericsson Texture Compression (ETC1)#tcf_etc2für Ericsson Texture Compression 2 (ETC2)#tcf_s3tcfür S3-Texturkomprimierung (S3TC)#tcf_3dcfü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 |