Format kompresi tekstur target di Android App Bundle

Tekstur adalah gambar yang dapat diterapkan ke platform model 3D. Tekstur juga digunakan oleh perender 2D untuk menggambar elemen seperti sprite atau latar belakang. Halaman ini menjelaskan format kompresi tekstur populer yang digunakan dalam game dan cara menargetkannya di Android App Bundle. Baca Tentang Android App Bundle dan Play Asset Delivery sebelum memulai panduan.

Latar belakang

GPU pada perangkat seluler biasanya mendukung serangkaian format kompresi tekstur. Format kompresi tekstur (atau TCF) adalah format file yang dioptimalkan untuk GPU. GPU memuat dan merender tekstur lebih cepat, dan dengan memori lebih sedikit, dibandingkan jika menggunakan array nilai RGBA dalam memori. Dukungan ini dilakukan pada level hardware: produsen GPU menyematkan komponen ke dalam kartu grafik yang membaca, mendekompresi, dan merender format yang didukung.

Berikut ini adalah format kompresi tekstur yang umum:

  • DDS atau GDTC: Terkadang disebut DxTC atau DxT n. Tiga bentuk format ini didukung oleh OpenGL.
  • ETC1: Didukung di sebagian besar perangkat. Format ini tidak memiliki dukungan transparansi, tetapi game dapat menggunakan file tekstur kedua untuk komponen alfa.
  • ETC2: Didukung oleh semua perangkat yang mendukung GLES3.
  • PVRTC: Populer di game iOS, dan juga didukung di beberapa perangkat Android.
  • ASTC: Format terbaru yang didesain untuk menggantikan format sebelumnya. Lebih fleksibel dibandingkan format sebelumnya karena adanya dukungan untuk berbagai ukuran blok. Menggunakan format ini merupakan cara yang baik untuk mengoptimalkan ukuran game Anda.

Format berikut didukung oleh persentase perangkat Android berikut:

Format kompresi tekstur Persentase perangkat Google Play dengan dukungan 1
ETC1 99%
ETC2 87%
ASTC 77%
ATC 35%
PVRTC 11%
DXT1 0.7%

1 Persentase yang dihitung menggunakan data yang dikumpulkan dari perangkat Google Play aktif pada September 2020

Format default

Dengan begitu banyak format yang tersedia (dengan berbagai tingkat dukungan perangkat), Anda bisa tidak tahu format mana yang digunakan saat membuat tekstur game. Sebagai fitur pengamanan, format app bundle memungkinkan Anda memilih format kompresi tekstur default untuk setiap asset pack. Jika perangkat tidak mendukung format tertentu lainnya, aset yang menggunakan format default ini akan diinstal.

Kecuali Anda menargetkan hardware perangkat tertentu, ETC1 dan ETC2 adalah pilihan yang baik untuk format default karena didukung oleh sebagian besar perangkat. Jika game Anda menargetkan OpenGL ES 3.0+, Anda dapat memilih ETC2 sebagai format default jika memilih salah satu format ETC2 yang dijamin didukung di OpenGL ES 3.0.

Membuat app bundle

Google Play menggunakan Android App Bundle untuk membuat dan menayangkan APK yang dioptimalkan untuk setiap konfigurasi perangkat pengguna, sehingga mereka hanya mendownload kode dan resource yang diperlukan untuk menjalankan game Anda. APK yang dioptimalkan ini mencakup sekumpulan aset tekstur, yang diformat dengan format kompresi optimal untuk perangkat.

Jika game Anda tidak berada di Unity, gunakan Gradle untuk membuat app bundle. Pengguna lanjutan mungkin ingin menggunakan bundletool.

Jika game Anda berada di Unity, Anda dapat menggunakan plugin Unity untuk membuat app bundle.

Menggunakan Gradle

  1. Update versi plugin Android Gradle di file build.gradle project Anda ke 4.1 canary 10 atau yang lebih baru (misalnya, com.android.tools.build:gradle:4.1.0-alpha10).

  2. Tentukan kumpulan jenis perangkat yang ingin Anda targetkan untuk game dan format kompresi tekstur yang didukungnya (untuk informasi format selengkapnya, lihat Latar Belakang).

  3. Buat versi aset untuk setiap format kompresi tekstur dari langkah sebelumnya. Hal ini dapat melibatkan pembuatan sprite sheet menggunakan software seperti TexturePacker, atau menjalankan skrip yang mengubah aset mentah menjadi aset dengan format tertentu (misalnya, astc-encoder).

  4. Buat paket aset (lihat Membuat aplikasi untuk native atau Java), yang berisi aset game Anda dan digunakan oleh Play Asset Delivery. Misalnya, Anda dapat membuat satu asset pack per level atau asset pack untuk bagian game yang berbeda.

  5. Di dalam paket aset, tambahkan direktori untuk setiap format kompresi tekstur yang ingin Anda dukung. Tambahkan akhiran yang didukung ke nama direktori tekstur yang sesuai dengan format kompresi tekstur yang digunakan untuk file yang dimuat tersebut.

    Buat direktori tanpa akhiran namanya (misalnya, common/src/main/assets/textures/). Dalam direktori ini, tempatkan format default aset tekstur Anda. Format default ini harus didukung oleh sebagian besar perangkat (misalnya, ETC1 atau ETC2). Jika perangkat tidak mendukung format tertentu lainnya (misalnya, PVRTC dan ASTC pada tabel di bawah), Google Play Store akan menginstal direktori ini.

    Direktori sebelumnya Direktori setelahnya
    asset pack common:
    common/build.gradle
    common/src/main/assets/textures/...
    asset pack common:
    common/build.gradle
    common/src/main/assets/textures/...
    common/src/main/assets/textures#tcf_astc/...
    common/src/main/assets/textures#tcf_pvrtc/...
    asset pack level1:
    level1/build.gradle
    level1/src/main/assets/textures/...
    asset pack level1:
    level1/build.gradle
    level1/src/main/assets/textures/...
    level1/src/main/assets/textures#tcf_astc/...
    level1/src/main/assets/textures#tcf_pvrtc/...
    asset pack level2:
    level2/build.gradle
    level2/src/main/assets/textures/...
    asset pack level2:
    level2/build.gradle
    level2/src/main/assets/textures/...
    level2/src/main/assets/textures#tcf_astc/...
    level2/src/main/assets/textures#tcf_pvrtc/...
  6. Update file build.gradle aplikasi untuk mengaktifkan pemisahan paket aset per tekstur.

    // In the app build.gradle file:
    android {
        ...
        bundle {
            texture {
                enableSplit true
            }
        }
    }
    
  7. Di Android Studio, pilih Build > Generate Signed Bundle / APK, atau luncurkan Tugas Gradle dari command line untuk membuat paket.

Menggunakan plugin Google Play Unity

Dapatkan plugin (atau paket) Unity untuk Play Asset Delivery guna membuat app bundle dengan paket aset bertarget tekstur.

Menyiapkan aset

Guna menyiapkan aset tekstur untuk membuat app bundle, lakukan hal berikut:

  1. Gabungkan scene dan aset Anda ke dalam beberapa AssetBundle Unity.

  2. Tentukan kumpulan jenis perangkat yang ingin Anda targetkan untuk game dan format kompresi tekstur yang didukungnya (untuk informasi format selengkapnya, lihat Latar Belakang).

  3. Ubah skrip build game Anda untuk membuat AssetBundle beberapa kali, sekali untuk masing-masing format tekstur yang ingin Anda dukung. Lihat contoh skrip berikut:

    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. Pastikan setiap aset tekstur dihasilkan dalam direktori dengan akhiran nama yang benar (misalnya #tcf_astc).

    Pastikan bahwa direktori tanpa akhiran nama adalah output (misalnya, Assets/AssetBundles/). Direktori ini berisi format default aset tekstur Anda. Format default ini harus didukung oleh sebagian besar perangkat (misalnya, ETC2). Jika perangkat tidak mendukung format tertentu lainnya (misalnya, ASTC dalam kode dari langkah sebelumnya), Google Play Store akan menginstal direktori ini.

    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. Pilih Google > Android > Assets Delivery.

  6. Klik Add Folder untuk menambahkan folder yang berisi asset pack default Anda. Paket ini diinstal di perangkat yang tidak mendukung format lain yang Anda tentukan.

    Pastikan Anda menyetel Delivery mode untuk AssetBundle.

    Format default Unity AssetBundle Delivery

  7. Klik Add Folder untuk menambahkan folder berisi AssetBundle yang dibuat untuk format lain (misalnya, ASTC). Ulangi sesuai kebutuhan.

    Pastikan Anda menyetel Delivery mode untuk masing-masing AssetBundle.

    Format ASTC Unity AssetBundle Delivery

Build

Pilih Google > Build Android App Bundle untuk meluncurkan build Unity untuk game Anda. Ini juga akan mengemas AssetBundle menjadi beberapa asset pack tempat masing-masing nama AssetBundle dikonversi menjadi satu asset pack.

(Lanjutan) Menggunakan bundletool

Untuk informasi selengkapnya tentang bundletool, lihat Membuat app bundle menggunakan bundletool.

Untuk membuat app bundle, lakukan hal berikut:

  1. Download bundletool dari repositori GitHub-nya.

  2. Tentukan kumpulan jenis perangkat yang ingin Anda targetkan untuk game dan format kompresi tekstur yang didukungnya (untuk informasi format selengkapnya, lihat Latar Belakang).

  3. Buat versi aset untuk setiap format kompresi tekstur dari langkah sebelumnya. Hal ini dapat melibatkan pembuatan sprite sheet menggunakan software seperti TexturePacker, atau menjalankan skrip yang mengubah aset mentah menjadi aset dengan format tertentu (misalnya, astc-encoder).

  4. Buat paket aset (lihat Membuat aplikasi untuk native atau Java), yang berisi aset game Anda dan digunakan oleh Play Asset Delivery. Misalnya, Anda dapat membuat satu asset pack per level atau asset pack untuk bagian game yang berbeda.

  5. Di paket aset yang berbeda, tambahkan akhiran yang didukung ke nama direktori tekstur yang sesuai dengan format kompresi tekstur yang digunakan untuk file yang dimuat tersebut.

    Buat direktori tanpa akhiran namanya (misalnya, common/src/main/assets/textures/). Dalam direktori ini, tempatkan format default aset tekstur Anda. Format default ini harus didukung oleh sebagian besar perangkat (misalnya, ETC1 atau ETC2). Jika perangkat tidak mendukung format tertentu lainnya (misalnya, PVRTC dan ASTC pada tabel di bawah), Google Play Store akan menginstal direktori ini.

    Direktori sebelumnya Direktori setelahnya
    asset pack common:
    common/build.gradle
    common/src/main/assets/textures/...
    asset pack common:
    common/build.gradle
    common/src/main/assets/textures/...
    common/src/main/assets/textures#tcf_astc/...
    common/src/main/assets/textures#tcf_pvrtc/...
    asset pack level1:
    level1/build.gradle
    level1/src/main/assets/textures/...
    asset pack level1:
    level1/build.gradle
    level1/src/main/assets/textures/...
    level1/src/main/assets/textures#tcf_astc/...
    level1/src/main/assets/textures#tcf_pvrtc/...
    asset pack level2:
    level2/build.gradle
    level2/src/main/assets/textures/...
    asset pack level2:
    level2/build.gradle
    level2/src/main/assets/textures/...
    level2/src/main/assets/textures#tcf_astc/...
    level2/src/main/assets/textures#tcf_pvrtc/...
  6. Tambahkan dimensi TCF ke file metadata app bundle (BundleConfig.json). Gunakan TEXTURE_COMPRESSION_FORMAT untuk bidang value:

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

    Setel suffixStripping.enabled ke true untuk menghapus akhiran (misalnya, #tcf_astc) dari nama direktori saat membuat asset pack. Dengan begitu, game Anda dapat membaca file dari nama direktori yang dikenal (seperti level1/assets/textures). Beberapa mesin game dapat mendeteksi format file, sehingga game Anda dapat mengganggu format aset tekstur yang diinstal.

    suffixStripping.defaultSuffix menentukan akhiran direktori default saat bundletool membuat APK mandiri untuk perangkat yang menjalankan Android 5.0 (API level 21) dan yang lebih rendah. Pada tabel contoh sebelumnya, versi default aset tekstur diinstal di perangkat ini; ini adalah perilaku yang diinginkan dalam sebagian besar kasus.

  7. Membuat app bundle

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

Memverifikasi konten app bundle

Jika belum, download bundletool dari repositori GitHub.

Verifikasi konten app bundle output dengan membuat APK dari output dan memeriksanya:

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

Outputnya akan mirip dengan berikut ini:

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

Nama-nama ini menunjukkan bahwa penargetan TCF diterapkan dengan benar. Jika mengekstrak konten APK level (misalnya, asset-slices/level1-astc.apk), Anda dapat memverifikasi bahwa tersedia hanya satu direktori yang bernama textures.

Menguji app bundle

Hubungkan perangkat dan instal asset pack yang berlaku:

bundletool install-apks --apks=APKS.apks

Perintah ini hanya akan menginstal asset pack yang memenuhi spesifikasi perangkat. Spesifikasi ini mencakup ABI, kepadatan layar, bahasa, dan format kompresi tekstur yang paling berlaku. Operasi ini menyimulasikan apa yang dilakukan oleh Google Play Store untuk game yang Anda publikasikan.

Untuk memverifikasi bahwa asset pack yang benar telah diinstal, lakukan salah satu langkah berikut:

  • Gunakan perintah bundletool extract-apks untuk memperoleh output apk yang diinstal untuk perangkat Anda ke dalam direktori, lalu periksa direktori ini.

    1. Ekstrak spesifikasi perangkat Anda:

      bundletool get-device-spec --output=MY_DEVICE_SPEC.json
      
    2. Jalankan bundletool extract-apks dengan spesifikasi perangkat ini:

      bundletool extract-apks --apks=APKS.apks --device-spec=MY_DEVICE_SPEC.json \
          --output-dir out
      
    3. Buat daftar file dalam direktori out dan pastikan bahwa asset pack yang tepat telah diinstal. Nama asset pack diberi akhiran oleh nama format tekstur (misalnya, level1-astc.apk).

  • Tambahkan pernyataan log dalam game yang menampilkan format tekstur saat memuat tekstur.

  • Buat kumpulan pengujian tekstur (misalnya, ganti tekstur dengan satu warna cerah untuk format tertentu). Jalankan game dan verifikasi bahwa game tersebut tersedia.

Jika aplikasi Anda berisi on-demand atau paket aset fast-follow, gunakan solusi pengujian lokal untuk pengiriman aset.

Akhiran yang didukung untuk nama direktori tekstur

Google Play memahami akhiran berikut yang digunakan dalam nama direktori tekstur:

  • #tcf_astc untuk Adaptive Scalable Texture Compression (ASTC)
  • #tcf_atc untuk kompresi tekstur ATI (ATC)
  • #tcf_dxt1 untuk kompresi tekstur S3 DXT1 (DXT1)
  • #tcf_latc untuk kompresi tekstur Luminance-Alpha (LATC)
  • #tcf_paletted untuk kompresi tekstur palet umum
  • #tcf_pvrtc untuk kompresi tekstur PowerVR (PVRTC)
  • #tcf_etc1 untuk kompresi tekstur Ericsson (ETC1)
  • #tcf_etc2 untuk kompresi tekstur Ericsson 2 (ETC2)
  • #tcf_s3tc untuk kompresi tekstur S3 (S3TC)
  • #tcf_3dc untuk kompresi tekstur 3Dc ATI (3Dc)

Aturan penayangan Google Play

Google Play memeriksa string ekstensi OpenGL yang digunakan oleh perangkat dan versi OpenGL yang didukung oleh perangkat. Google Play menggunakan informasi ini untuk menentukan format tekstur yang tepat untuk dikirimkan ke perangkat dari Android App Bundle.

Google Play menampilkan format pertama, dalam urutan yang tercantum dalam tabel berikut, yang didukung oleh perangkat.

Jika tidak ada satu pun format tekstur di App Bundle yang didukung oleh perangkat, Google Play mengirimkan format tekstur yang dikemas dalam format default. (Kecuali Anda menargetkan hardware perangkat tertentu, ETC1 atau ETC2 adalah pilihan yang baik untuk format default.) Untuk informasi tentang cara mengemas aset dalam format default, lihat Menggunakan bundletool atau Menggunakan plugin Google Play Unity.

Jika aset belum dikemas dalam format default, Google Play akan menandai aplikasi tersebut sebagai tidak tersedia untuk perangkat tersebut. Dalam hal ini, pengguna tidak dapat mendownload aplikasi.

Format (ditetapkan dalam tcf_xxxx) Didukung pada perangkat dengan string ekstensi OpenGL
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 Tidak berlaku. Perangkat harus mendukung OpenGL ES versi 3.0 atau yang lebih baru.
etc1 GL_OES_compressed_ETC1_RGB8_texture
palet GL_OES_compressed_paletted_texture