Android App Bundle'larda doku sıkıştırma biçimlerini hedefleme

Dokular, 3D modelin yüzeyine uygulanabilecek resimlerdir. Dokular, 2D oluşturucular tarafından sprite görselleri veya arka planlar gibi öğeleri çizmek için de kullanılır. Bu sayfada, oyunlarda kullanılan popüler doku sıkıştırma biçimleri ve bunların Android App Bundle'da nasıl hedefleneceği açıklanmaktadır. Bu kılavuza başlamadan önce Android App Bundle hakkında ve Play Asset Delivery'yi okuyun.

Arka plan

GPU'lar genellikle bir dizi doku sıkıştırma biçimini destekler. Doku sıkıştırma biçimi (TCF), GPU'lar için optimize edilmiş bir dosya biçimidir. GPU, bellekte bir RGBA değerleri dizisi kullanmaya kıyasla bir dokuyu daha hızlı ve daha az bellekle yükler ve oluşturur. Bu destek donanım düzeyinde gerçekleştirilir: GPU üreticisi, desteklenen biçimleri okuyan, sıkıştıran ve oluşturan bileşenleri grafik kartı çipine yerleştirir.

Modern mobil donanımlarda yaygın olarak kullanılan doku sıkıştırma biçimleri şunlardır:

  • ASTC: Önceki biçimlerin yerini alacak şekilde tasarlanmış yeni biçim. Çeşitli blok boyutları desteği sayesinde önceki biçimlerden daha esnektir. Bu biçimi kullanmak, oyununuzun boyutunu optimize etmek için iyi bir yöntemdir.
  • ETC2: OpenGL ES 3.0 ve sonraki sürümlerini destekleyen tüm cihazlar tarafından desteklenir. Bu, neredeyse tüm etkin Android mobil cihazları içerir.

Bu biçimler, Android cihazların aşağıdaki yaklaşık yüzdeleri ile desteklenir:

Doku sıkıştırma biçimi Destek sunan Google Play cihazlarının yüzdesi
ASTC >%80
ETC2 >%95

PC için Google Play Games'i çalıştıran masaüstü bilgisayar GPU'ları şu biçimi de destekler:

  • DDS veya S3TC: Bazen BCn, DXTC veya DXTn olarak adlandırılır.

Eski ve artık önerilmeyen doku sıkıştırma biçimleri şunlardır:

  • ETC1: Çoğu cihazda desteklenir. Bu biçimin şeffaflık desteği yoktur ancak oyunlar alfa bileşeni için ikinci bir doku dosyası kullanabilir.
  • PVRTC: iOS oyunlarında popülerdir ve bazı Android cihazlarda da desteklenir.

ETC1 desteği yalnızca çok eski eski cihazları destekleyen oyunlar veya OpenGL ES 3.0 ve üstünü desteklemeyen belirli Android TV cihazları için gereklidir.

Varsayılan biçim

Kullanılabilecek çok sayıda biçim (çeşitli cihaz desteği seviyelerinde) olduğundan, oyun dokularınızı oluştururken hangi biçimleri kullanmanız gerektiğini bilemeyebilirsiniz. Uygulama paketi biçimi, önlem olarak her öğe paketi için varsayılan bir doku sıkıştırma biçimi seçmenize olanak tanır. Bir cihaz belirtilen diğer biçimleri desteklemiyorsa bu varsayılan biçimi kullanan öğeler yüklenir.

Çok eski cihaz donanımlarını hedeflemiyorsanız varsayılan biçim için ETC2 iyi bir seçimdir. OpenGL ES 3.0'da desteklenmesi garanti edilen ETC2 biçimlerini kullanmanız gerekir. Bu biçimler VulkanGraphic API'de de kullanılabilmektedir.

ASTC biçimi, çeşitli sıkıştırma bloğu boyutlarını tanımlar. Bu sayede, daha fazla sıkıştırma için azaltılmış resim kalitesini seçerek değiştirebilirsiniz. Kaynak resim malzemesinin niteliğine bağlı olarak, belirli bir doku için kabul edilebilir görsel kaliteyi korumak amacıyla daha küçük veya daha büyük bir blok boyutu seçebilirsiniz.

Oyununuz PC için Google Play Games'i destekliyorsa ve Vulkan'ı kullanıyorsa S3TC dokularını eklemeniz gerekir. S3TC biçimleri, tüm masaüstü GPU'ları tarafından desteklenir.

Uygulama paketi oluşturma

Google Play, her kullanıcının cihaz yapılandırmasına göre optimize edilmiş APK'lar oluşturmak ve sunmak için Android App Bundle'ı kullanır. Böylece, kullanıcılar yalnızca oyununuzu çalıştırmak için ihtiyaç duydukları kodu ve kaynakları indirir. Optimize edilmiş bu APK'lar, cihaz için optimum sıkıştırma biçimiyle biçimlendirilmiş tek bir doku öğesi grubu içerir.

Oyununuz Unity'de değilse uygulama paketi oluşturmak için Gradle kullanın. İleri düzey kullanıcılar bundletool kullanmayı tercih edebilir.

Oyununuz Unity'deyse Unity 2021.3 ve sonraki sürümlerde Play Asset Delivery ile uygulama paketleri desteği sunulur. Daha fazla bilgi için Unity belgelerine bakın. Unity'nin daha düşük sürümlerine sahip bir uygulama paketi oluşturmak için Unity eklentisi kullanabilirsiniz.

Gradle'ı kullan

  1. Projenizin build.gradle dosyasındaki Android Gradle eklentisinin sürümünü 4.1 veya daha yeni bir sürüme (ör. com.android.tools.build:gradle:4.1.0) güncelleyin.

  2. Oyununuz için hedeflemek istediğiniz cihaz türü grubunu ve bunların desteklediği doku sıkıştırma biçimlerini belirleyin (biçimler hakkında daha fazla bilgi için Arka plan bölümüne bakın).

  3. Önceki adımda kullandığınız her doku sıkıştırma biçimi için öğelerinizin sürümlerini oluşturun. Bu, TexturePacker gibi yazılımlar kullanarak model sayfaları oluşturmayı veya ham öğeleri belirli bir biçime sahip olanlara dönüştüren bir komut dosyası çalıştırmayı (örneğin, astc-kodlayıcı) çalıştırmayı içerebilir.

  4. Oyun öğelerinizi içeren ve Play Asset Delivery tarafından kullanılan öğe paketleri oluşturun (C++ veya Java için Derleme bölümüne bakın). Örneğin, her seviye için bir öğe paketi veya oyununuzun farklı bölümleri için öğe paketleri oluşturabilirsiniz.

  5. Öğe paketlerinizin içine, desteklemek istediğiniz her doku sıkıştırma biçimi için dizinler ekleyin. Desteklenen sonekleri, içerilen dosyalar için kullanılan doku sıkıştırma biçimine karşılık gelen doku dizini adlarına ekleyin.

    Adında sonek olmayan bir dizin oluşturun (örneğin, common/src/main/assets/textures/). Bu dizine doku öğelerinizin varsayılan biçimini yerleştirin. Bu varsayılan biçim çoğu cihaz (örneğin, ETC1 veya ETC2) tarafından desteklenmelidir. Bir cihaz belirtilen diğer biçimleri (örneğin, aşağıdaki tabloda PVRTC ve ASTC) desteklemiyorsa Google Play Store bunun yerine bu dizini yükler.

    Önceki dizin Sonraki dizin
    common öğe paketi:
    common/build.gradle
    common/src/main/assets/textures/...
    common öğe paketi:
    common/build.gradle
    common/src/main/assets/textures/...
    ortak/src/main/assets/textures#tcf_astc/...
    ortak/src/main/assets/textures#tcf_pvrtc/...
    level1 öğe paketi:
    level1/build.gradle
    level1/src/main/assets/textures/...
    level1 öğe paketi:
    level1/build.gradle
    level1/src/main/assets/textures/...
    level1/src/main/assets/textures#tcf_astc/...
    level1/src/main/assets/textures#tcf_pvrtc/...
    level2 öğe paketi:
    level2/build.gradle
    level2/src/main/assets/textures/...
    level2 öğe paketi:
    level2/build.gradle
    level2/src/main/assets/textures/...
    level2/src/main/assets/textures#tcf_astc/...
    level2/src/main/assets/textures#tcf_pvrtc/...
  6. Öğe paketlerinizin dokulara göre bölünmesini etkinleştirmek için uygulamanızın build.gradle dosyasını güncelleyin.

    // In the app build.gradle file:
    android {
        ...
        bundle {
            texture {
                enableSplit true
            }
        }
    }
    
  7. Android Studio'da, Derleme > İmzalanmış Paket / APK Oluştur'u seçin veya paketinizi oluşturmak için komut satırından Gradle görevini başlatın.

Google Play Unity eklentisini kullanma

Doku hedefli öğe paketleri içeren bir uygulama paketi oluşturmak için Play Asset Delivery için Unity eklentisini (veya paketini) edinin.

Öğeleri hazırlama

Doku öğelerinizi uygulama paketi oluşturmak üzere hazırlamak için aşağıdakileri yapın:

  1. Sahnenizi ve öğelerinizi birden fazla Unity AssetBundles öğesinde paketleyin.

  2. Oyununuz için hedeflemek istediğiniz cihaz türü grubunu ve bunların desteklediği doku sıkıştırma biçimlerini belirleyin (biçimler hakkında daha fazla bilgi için Arka plan bölümüne bakın).

  3. Oyununuzun derleme komut dosyasını değiştirerek AssetBundles'ı, desteklemek istediğiniz her doku biçimi için bir kez olmak üzere birden fazla kez oluşturun. Aşağıdaki örnek komut dosyasına bakın:

    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. Her doku öğesinin, adında doğru son ek ile bir dizinde oluşturulduğunu doğrulayın (örneğin, #tcf_astc).

    Adında son ek olmayan bir dizinin çıkış olduğunu doğrulayın (örneğin, Assets/AssetBundles/). Bu dizin, doku öğelerinizin varsayılan biçimini içerir. Bu varsayılan biçim çoğu cihaz (örneğin, ETC2) tarafından desteklenmelidir. Bir cihaz, belirtilen diğer biçimleri (örneğin, önceki adımdaki kodda bulunan ASTC) desteklemiyorsa Google Play Store bunun yerine bu dizini yükler.

    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. Google > Android > Asset Delivery'yi seçin.

  6. Varsayılan öğe paketlerinizi içeren klasörü eklemek için Klasör ekle'yi tıklayın. Bu paketler, tanımladığınız diğer biçimleri desteklemeyen cihazlara yüklenir.

    AssetBundle için Yayınlama modunu ayarladığınızdan emin olun.

    Unity AssetBundle Delivery varsayılan biçimi

  7. Başka bir biçim (örneğin, ASTC) için oluşturulmuş AssetBundles içeren bir klasör eklemek üzere Klasör Ekle'yi tıklayın. Gerekiyorsa işlemi tekrarlayın.

    Her AssetBundle için Yayınlama modunu ayarladığınızdan emin olun.

    Unity AssetBundle Delivery ASTC biçimi

Topluluk

Oyununuzun Unity derlemesini başlatmak için Google > Android App Bundle'ı Geliştir'i seçin. Ayrıca AssetBundles'ı, her AssetBundle adının tek bir öğe paketine dönüştürüldüğü birden fazla öğe paketi halinde paketler.

(Gelişmiş) Bundletool'u kullanma

bundletool hakkında daha fazla bilgi için Bundletool kullanarak uygulama paketi oluşturma bölümüne bakın.

Uygulama paketini oluşturmak için şunları yapın:

  1. GitHub deposundan bundletool uygulamasını indirin.

  2. Oyununuz için hedeflemek istediğiniz cihaz türü grubunu ve bunların desteklediği doku sıkıştırma biçimlerini belirleyin (biçimler hakkında daha fazla bilgi için Arka plan bölümüne bakın).

  3. Önceki adımda kullandığınız her doku sıkıştırma biçimi için öğelerinizin sürümlerini oluşturun. Bu, TexturePacker gibi yazılımlar kullanarak model sayfaları oluşturmayı veya ham öğeleri belirli bir biçime sahip olanlara dönüştüren bir komut dosyası çalıştırmayı (örneğin, astc-kodlayıcı) çalıştırmayı içerebilir.

  4. Oyun öğelerinizi içeren ve Play Asset Delivery tarafından kullanılan öğe paketleri oluşturun (C++ veya Java için Derleme bölümüne bakın). Örneğin, her seviye için bir öğe paketi veya oyununuzun farklı bölümleri için öğe paketleri oluşturabilirsiniz.

  5. Farklı öğe paketlerinizde, desteklenen sonekleri, içerdiği dosyalar için kullanılan doku sıkıştırma biçimine karşılık gelen doku dizini adlarına ekleyin.

    Adında sonek olmayan bir dizin oluşturun (örneğin, common/src/main/assets/textures/). Bu dizine doku öğelerinizin varsayılan biçimini yerleştirin. Bu varsayılan biçim çoğu cihaz (örneğin, ETC1 veya ETC2) tarafından desteklenmelidir. Bir cihaz belirtilen diğer biçimleri (örneğin, aşağıdaki tabloda PVRTC ve ASTC) desteklemiyorsa Google Play Store bunun yerine bu dizini yükler.

    Önceki dizin Sonraki dizin
    common öğe paketi:
    common/build.gradle
    common/src/main/assets/textures/...
    common öğe paketi:
    common/build.gradle
    common/src/main/assets/textures/...
    ortak/src/main/assets/textures#tcf_astc/...
    ortak/src/main/assets/textures#tcf_pvrtc/...
    level1 öğe paketi:
    level1/build.gradle
    level1/src/main/assets/textures/...
    level1 öğe paketi:
    level1/build.gradle
    level1/src/main/assets/textures/...
    level1/src/main/assets/textures#tcf_astc/...
    level1/src/main/assets/textures#tcf_pvrtc/...
    level2 öğe paketi:
    level2/build.gradle
    level2/src/main/assets/textures/...
    level2 öğe paketi:
    level2/build.gradle
    level2/src/main/assets/textures/...
    level2/src/main/assets/textures#tcf_astc/...
    level2/src/main/assets/textures#tcf_pvrtc/...
  6. Uygulama paketi meta veri dosyasına (BundleConfig.json) TCF boyutunu ekleyin. value alanı için TEXTURE_COMPRESSION_FORMAT değerini kullanın:

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

    Öğe paketlerini oluştururken dizin adlarından son eki (örneğin, #tcf_astc) kaldırmak için suffixStripping.enabled değerini true olarak ayarlayın. Bu, oyununuzun bilinen bir dizin adındaki dosyaları (level1/assets/textures gibi) okumasını sağlar. Bazı oyun motorları dosya biçimini algılayabilir. Bu nedenle, oyununuz, birlikte yüklendiği doku öğelerinin biçimine kayıtsız kalabilir.

    bundletool, Android 5.0 (API düzeyi 21) ve önceki sürümleri çalıştıran cihazlar için bağımsız bir APK oluşturduğunda suffixStripping.defaultSuffix, varsayılan dizin son ekini belirtir. Önceki örnek tabloda, doku öğelerinin varsayılan sürümü bu cihazlara yüklenir. Çoğu durumda amaçlanan davranış budur.

  7. Uygulama paketini oluşturun:

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

Uygulama paketinin içeriğini doğrulayın

Henüz yapmadıysanız GitHub deposundan bundletool uygulamasını indirin.

Çıkış uygulama paketinden APK'lar oluşturup inceleyerek bu uygulama paketinin içeriğini doğrulayın:

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

Çıkış şuna benzer olmalıdır:

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

Bu adlar, TCF hedeflemesinin doğru şekilde uygulandığını gösterir. Düzey bir APK'nın (örneğin, asset-slices/level1-astc.apk) içeriğini çıkarırsanız textures adlı yalnızca bir dizinin bulunduğunu doğrulayabilirsiniz.

Uygulama paketini test edin

Bir cihaz bağlayın ve geçerli öğe paketlerini yükleyin:

bundletool install-apks --apks=APKS.apks

Bu komut yalnızca cihazın teknik özelliklerini karşılayan öğe paketlerini yükler. Bu özellikler arasında ABI, ekran yoğunluğu, dil ve en uygun doku sıkıştırma biçimi bulunur. Bu işlem, yayınlanan oyununuz için Google Play Store'un yaptığını simüle eder.

Doğru öğe paketlerinin yüklendiğini doğrulamak için aşağıdakilerden birini yapın:

  • Cihazınız için yüklenen apk'lerin çıktısını bir dizine eklemek ve daha sonra, bu dizini denetlemek için bundletool extract-apks komutunu kullanın.

    1. Cihazınızın teknik özelliklerini çıkarın:

      bundletool get-device-spec --output=MY_DEVICE_SPEC.json
      
    2. bundletool extract-apks uygulamasını şu cihaz spesifikasyonuyla çalıştırın:

      bundletool extract-apks --apks=APKS.apks --device-spec=MY_DEVICE_SPEC.json \
          --output-dir out
      
    3. Dosyaları out dizininde listeleyin ve uygun öğe paketlerinin yüklendiğini doğrulayın. Öğe paketi adlarının son eki doku biçimi adıyla eklenir (örneğin, level1-astc.apk).

  • Oyununuza, bir doku yüklerken doku biçimi oluşturan günlük ifadeleri ekleyin.

  • Bir doku grubu oluşturun (örneğin, bir dokuyu belirli bir biçim için tek bir parlak renkle değiştirin). Oyunu çalıştırın ve oyunun mevcut olduğunu doğrulayın.

Uygulamanız on-demand veya fast-follow öğe paketi içeriyorsa öğe yayınlama için yerel test çözümünü kullanın.

Doku dizini adları için desteklenen sonekler

Google Play, doku dizini adlarında kullanılan aşağıdaki son ekleri anlar:

  • Uyarlanabilir Ölçeklenebilir Doku Sıkıştırma (ASTC) için #tcf_astc
  • ATI doku sıkıştırma (ATC) için #tcf_atc
  • S3 DXT1 doku sıkıştırma (DXT1) için #tcf_dxt1
  • Parlaklık-Alfa doku sıkıştırma (LATC) için #tcf_latc
  • Genel paletli doku sıkıştırma için #tcf_paletted
  • PowerVR doku sıkıştırma (PVRTC) için #tcf_pvrtc
  • Ericsson doku sıkıştırma (ETC1) için #tcf_etc1
  • Ericsson doku sıkıştırma 2 (ETC2) için #tcf_etc2
  • S3 doku sıkıştırma (S3TC) için #tcf_s3tc
  • ATI 3Dc doku sıkıştırma (3Dc) için #tcf_3dc

Google Play sunum kuralları

Google Play, cihaz tarafından kullanılan OpenGL uzantı dizelerini ve cihaz tarafından desteklenen OpenGL sürümünü inceler. Google Play bu bilgileri, Android App Bundle'dan cihaza aktarılacak doğru doku biçimini belirlemek için kullanır.

Google Play, aşağıdaki tabloda listelenen sırayla ve cihaz tarafından desteklenen ilk biçimi yayınlar.

Uygulama Paketi'ndeki doku biçimlerinin hiçbiri cihaz tarafından desteklenmiyorsa Google Play, varsayılan biçimde paketlenmiş doku biçimlerini yayınlar. (Belirli bir cihaz donanımını hedeflemezseniz varsayılan biçim için ETC1 veya ETC2 iyi seçimlerdir.) Öğeleri varsayılan biçimde paketleme hakkında bilgi için Paket aracını kullanma veya Google Play Unity eklentisini kullanma konularına bakın.

Öğeler varsayılan biçimde paketlenmemişse Google Play, uygulamayı cihazda kullanılamıyor olarak işaretler. Bu durumda kullanıcılar uygulamayı indiremez.

Biçim (tcf_xxxx olarak tanımlanmış) OpenGL uzantı dizesine sahip cihazlarda desteklenir.
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
AT GL_AMD_compressed_ATC_texture
3D GL_AMD_compressed_3DC_texture
vb2 Geçerli değil. Cihaz, OpenGL ES 3.0 veya sonraki sürümlerini desteklemelidir.
vb1 GL_OES_compressed_ETC1_RGB8_texture
Paletli GL_OES_compressed_paletted_texture