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 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 chip kartu grafik yang membaca, mendekompresi, dan merender format yang didukung.

Berikut adalah format kompresi tekstur umum pada hardware seluler modern:

  • ASTC: Format terbaru yang didesain untuk menggantikan format sebelumnya. Lebih fleksibel dibandingkan format sebelumnya karena adanya dukungan untuk berbagai ukuran blok. Penggunaan format ini merupakan cara yang baik untuk mengoptimalkan ukuran game Anda.
  • ETC2: Didukung oleh semua perangkat yang mendukung OpenGL ES 3.0 dan yang lebih baru. Dukungan tersebut termasuk hampir semua perangkat seluler Android aktif.

Format ini didukung oleh perkiraan persentase perangkat Android berikut:

Format kompresi tekstur Persentase perangkat Google Play dengan dukungan
ASTC >80%
ETC2 >95%

GPU komputer desktop yang menjalankan Google Play Game untuk PC juga mendukung format ini:

  • DDS atau S3TC: Terkadang disebut BCn, DxTC, atau DxT n.

Format kompresi tekstur yang lebih lama dan tidak direkomendasikan lagi mencakup:

  • ETC1: Didukung di sebagian besar perangkat. Format ini tidak memiliki dukungan transparansi, tetapi game dapat menggunakan file tekstur kedua untuk komponen alfa.
  • PVRTC: Populer di game iOS, serta didukung di beberapa perangkat Android.

Dukungan ETC1 hanya merupakan persyaratan untuk game yang mendukung perangkat sangat versi lama atau perangkat Android TV tertentu yang tidak mendukung OpenGL ES 3.0 dan yang lebih baru.

Format default

Dengan begitu banyak format yang tersedia (dengan berbagai tingkat dukungan perangkat), Anda mungkin tidak mengetahui format mana yang digunakan saat membangun tekstur game. Sebagai perlindungan, format app bundle memungkinkan Anda memilih format kompresi tekstur default untuk setiap paket aset. Jika perangkat tidak mendukung format tertentu lainnya, aset yang menggunakan format default ini akan diinstal.

Kecuali jika Anda menargetkan hardware perangkat versi sangat lama, ETC2 adalah pilihan yang tepat untuk format default. Anda harus menggunakan format ETC2 yang dijamin didukung di OpenGL ES 3.0. Format ini juga tersedia di API grafis Vulkan.

Format ASTC menentukan berbagai ukuran blok kompresi, sehingga Anda dapat menukar kualitas gambar yang lebih rendah secara selektif untuk kompresi yang lebih besar. Bergantung pada sifat materi gambar sumber, untuk tekstur tertentu, Anda dapat memilih ukuran blok yang lebih kecil atau lebih besar guna mempertahankan kualitas visual yang dapat diterima.

Jika game Anda mendukung Google Play Game untuk PC dan menggunakan Vulkan, Anda harus menyertakan tekstur S3TC. Format S3TC didukung oleh semua GPU desktop.

Membangun app bundle

Google Play menggunakan Android App Bundle guna membuat dan menayangkan APK yang dioptimalkan untuk setiap konfigurasi perangkat pengguna, sehingga pengguna 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 menggunakan Unity, dukungan untuk app bundle dengan Play Asset Delivery tersedia di Unity 2021.3 dan yang lebih baru. Untuk mengetahui informasi selengkapnya, lihat dokumentasi Unity. Anda dapat menggunakan plugin Unity untuk membangun app bundle dengan versi Unity yang lebih rendah.

Menggunakan Gradle

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

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

  3. Buat versi aset untuk setiap format kompresi tekstur dari langkah sebelumnya. Cara ini termasuk membuat sprite sheet menggunakan software seperti TexturePacker, atau menjalankan skrip yang mengonversi aset raw menjadi aset dengan format tertentu (misalnya, astc-encoder).

  4. Buat paket aset (lihat Membangun aplikasi untuk C++ atau Java), yang berisi aset game Anda dan digunakan oleh Play Asset Delivery. Misalnya, Anda dapat membuat satu paket aset per level atau paket aset 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 Unity Google Play

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 mengetahui informasi selengkapnya tentang format, 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 game Anda. Dengan cara ini, AssetBundle juga dikemas menjadi beberapa paket aset tempat setiap nama AssetBundle dikonversi menjadi satu paket aset.

(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 mengetahui informasi selengkapnya tentang format, lihat Latar belakang).

  3. Buat versi aset untuk setiap format kompresi tekstur dari langkah sebelumnya. Cara ini termasuk membuat sprite sheet menggunakan software seperti TexturePacker, atau menjalankan skrip yang mengonversi aset raw menjadi aset dengan format tertentu (misalnya, astc-encoder).

  4. Buat paket aset (lihat Membangun aplikasi untuk C++ atau Java), yang berisi aset game Anda dan digunakan oleh Play Asset Delivery. Misalnya, Anda dapat membuat satu paket aset per level atau paket aset 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 paket aset. Dengan begitu, game Anda dapat membaca file dari nama direktori yang dikenal (seperti level1/assets/textures). Beberapa game engine dapat mendeteksi format file sehingga game Anda dapat kompatibel dengan berbagai format aset tekstur yang diinstal.

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

  7. Bangun 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 melakukannya, 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 paket aset yang berlaku:

bundletool install-apks --apks=APKS.apks

Perintah ini hanya menginstal paket aset yang memenuhi spesifikasi perangkat. Spesifikasi ini mencakup ABI, kepadatan layar, bahasa, dan format kompresi tekstur yang paling sering diterapkan. 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