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

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

Arka plan

GPU'lar genellikle bir dizi doku sıkıştırma biçimini destekler. Doku sıkıştırma biçimi (veya TCF), GPU'lar için optimize edilmiş bir dosya biçimidir. GPU, bellekteki bir RGBA değerleri dizisini kullanmaya kıyasla dokuyu daha hızlı ve daha az bellekle yükleyip oluşturur. Bu destek, donanım düzeyinde sağlanır: GPU üreticisi, desteklenen biçimleri okuyan, açan 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 alması için tasarlanmış yeni bir biçimdir. Çeşitli blok boyutlarını desteklediği için önceki biçimlere göre daha esnektir. Bu biçimi kullanmak, oyununuzun boyutunu optimize etmenin iyi bir yoludur.
  • ETC2: OpenGL ES 3.0 ve sonraki sürümleri destekleyen tüm cihazlar tarafından desteklenir. Neredeyse tüm etkin Android mobil cihazlar buna dahildir.

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

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

PC Üzerinde Google Play Games'i çalıştıran masaüstü bilgisayar GPU'ları da bu biçimi destekler:

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

Artık önerilmeyen eski doku sıkıştırma biçimleri şunlardır:

  • ETC1: Çoğu cihazda desteklenir. Bu biçim şeffaflığı desteklemez 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 cihazları veya OpenGL ES 3.0 ve sonraki sürümleri desteklemeyen belirli Android TV cihazlarını destekleyen oyunlar için gereklidir.

Varsayılan biçim

Çok sayıda format (farklı düzeylerde cihaz desteğiyle) olduğundan oyun dokularınızı oluştururken hangi formatları kullanacağınızı bilemeyebilirsiniz. Uygulama paketi biçimi, her öğe paketi için varsayılan bir doku sıkıştırma biçimi seçmenize olanak tanıyarak koruma sağlar. Cihaz, belirtilen diğer biçimleri desteklemiyorsa bu varsayılan biçimi kullanan öğeler yüklenir.

Çok eski cihaz donanımlarını hedeflemiyorsanız ETC2, varsayılan biçim için iyi bir seçimdir. OpenGL ES 3.0'da desteklenen ETC2 biçimlerini kullanın. Bu biçimler Vulkan grafik API'sinde de kullanılabilir.

ASTC biçimi, daha fazla sıkıştırma için resim kalitesini seçerek düşürmenize olanak tanıyan çeşitli sıkıştırma blok boyutları tanımlar. Kaynak resim materyalinin yapısına 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 destekliyor 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ı için optimize edilmiş APK'lar oluşturmak ve yayınlamak üzere Android App Bundle'ları kullanır. Böylece kullanıcılar yalnızca oyununuzu çalıştırmak için ihtiyaç duydukları kodları ve kaynakları indirir. Bu optimize edilmiş APK'lar, cihaz için en uygun 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 kullanmak isteyebilir.

Oyununuz Unity'de ise Play Asset Delivery ile uygulama paketleri desteği Unity 2021.3 ve sonraki sürümlerde kullanılabilir. Daha fazla bilgi için Unity belgelerine bakın. Unity'nin daha eski sürümleriyle uygulama paketi oluşturmak için Unity eklentisi kullanabilirsiniz.

Gradle kullanma

  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ürlerini ve destekledikleri 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 belirlediğiniz 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 (ör. astc-encoder) dönüştüren bir komut dosyası çalıştırmayı içerebilir.

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

  5. Öğe paketlerinize, desteklemek istediğiniz her doku sıkıştırma biçimi için dizinler ekleyin. İçerilen dosyalar için kullanılan doku sıkıştırma biçimine karşılık gelen doku dizini adlarına desteklenen son ekleri ekleyin.

    Adında son ek olmayan bir dizin oluşturun (ör. common/src/main/assets/textures/). Bu dizine doku öğelerinizin varsayılan biçimini yerleştirin. Bu varsayılan biçim çoğu cihaz tarafından desteklenmelidir (ör. ETC1 veya ETC2). Cihaz, belirtilen diğer biçimleri (örneğin, aşağıdaki tabloda yer alan 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/...
    common/src/main/assets/textures#tcf_astc/...
    common/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 Build > Generate Signed Bundle / APK (Derle > İmzalı Paket/APK Oluştur) seçeneğini belirleyin veya paketinizi oluşturmak için Gradle görevini komut satırından 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şturmaya hazırlamak için aşağıdakileri yapın:

  1. Sahnenizi ve öğelerinizi birden fazla Unity AssetBundle'ı halinde paketleyin.

  2. Oyununuz için hedeflemek istediğiniz cihaz türlerini ve destekledikleri 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ı, desteklemek istediğiniz her doku biçimi için bir kez olmak üzere AssetBundle'ları birden çok kez oluşturacak şekilde değiştirin. 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 (ör. #tcf_astc) bulunan bir dizine çıkarıldığını doğrulayın.

    Adında son ek bulunmayan bir dizinin oluşturulduğunu doğrulayın (ör. Assets/AssetBundles/). Bu dizinde, doku öğelerinizin varsayılan biçimi bulunur. Bu varsayılan biçim çoğu cihaz tarafından desteklenmelidir (ör. ETC2). Bir cihaz, belirtilen diğer biçimleri (örneğin, önceki adımda yer alan koddaki 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 > Assets Delivery'yi seçin.

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

    AssetBundle için Yayınlama modu'nu ayarladığınızdan emin olun.

    Unity AssetBundle Delivery varsayılan biçimi

  7. Başka bir biçim (ör. ASTC) için oluşturulmuş AssetBundle'ları içeren bir klasör eklemek üzere Klasör Ekle'yi tıklayın. Bu işlemi gerektiği kadar tekrarlayın.

    Her AssetBundle için Yayınlama modu'nu ayarladığınızdan emin olun.

    Unity AssetBundle Delivery ASTC biçimi

Derleme

Oyununuzun Unity derlemesini başlatmak için Google > Build Android App Bundle'ı (Google > Android App Bundle Derle) seçin. Ayrıca AssetBundle'ları birden fazla öğe paketi halinde paketler ve her AssetBundle adı tek bir öğe paketine dönüştürülür.

(İleri düzey) bundletool'u kullanma

bundletool hakkında daha fazla bilgi için bundletool kullanarak uygulama paketi oluşturma başlıklı makaleyi inceleyin.

Uygulama paketini oluşturmak için aşağıdakileri yapın:

  1. bundletool aracını GitHub deposundan indirin.

  2. Oyununuz için hedeflemek istediğiniz cihaz türlerini ve destekledikleri 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 belirlediğiniz 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 (ör. astc-encoder) dönüştüren bir komut dosyası çalıştırmayı içerebilir.

  4. Oyun öğelerinizi içeren ve Play Asset Delivery tarafından kullanılan öğe paketleri (C++ veya Java için derleme bölümüne bakın) oluşturun. Ö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, içerilen dosyalar için kullanılan doku sıkıştırma biçimine karşılık gelen doku dizini adlarına desteklenen son ekleri ekleyin.

    Adında son ek olmayan bir dizin oluşturun (ör. common/src/main/assets/textures/). Bu dizine doku öğelerinizin varsayılan biçimini yerleştirin. Bu varsayılan biçim çoğu cihaz tarafından desteklenmelidir (ör. ETC1 veya ETC2). Cihaz, belirtilen diğer biçimleri (örneğin, aşağıdaki tabloda yer alan 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/...
    common/src/main/assets/textures#tcf_astc/...
    common/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. TCF boyutunu uygulama paketi meta veri dosyasına (BundleConfig.json) 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 paketleri oluşturulurken dizin adlarından son eki (ör. #tcf_astc) kaldırmak için suffixStripping.enabled değerini true olarak ayarlayın. Bu sayede oyununuz, iyi bilinen bir dizin adından (ör. level1/assets/textures) dosyaları okuyabilir. Bazı oyun motorları bir dosyanın biçimini algılayabilir. Bu sayede oyununuz, yüklendiği doku öğelerinin biçiminden bağımsız olabilir.

    suffixStripping.defaultSuffix, 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 varsayılan dizin son ekini belirtir. Yukarıdaki örnek tabloda, doku öğelerinin varsayılan sürümü bu cihazlara yüklenir. Çoğu durumda istenen 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ğrulama

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

Çıkış uygulama paketinden APK'lar oluşturup bunları inceleyerek paketin 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. Bir seviye APK'sının (ör. asset-slices/level1-astc.apk) içeriğini ayıklarsanız textures adlı yalnızca bir dizinin mevcut olduğunu doğrulayabilirsiniz.

Uygulama paketini test etme

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

bundletool install-apks --apks=APKS.apks

Bu komut, yalnızca cihazın ö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 yer alır. Bu işlem, yayınlanan oyununuz için Google Play Store'un yaptıkları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'ları bir dizine çıkarmak ve ardından bu dizini incelemek için bundletool extract-apks komutunu kullanın.

    1. Cihazınızın özelliklerini ayıklayın:

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

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

  • Oyununuza, doku yüklerken doku biçimini veren günlük ifadeleri ekleyin.

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

Uygulamanızda on-demand veya fast-follow öğe paketi varsa Asset Delivery için yerel test çözümünü kullanın.

Doku dizini adları için desteklenen son ekler

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

  • #tcf_astc (Uyarlanabilir Ölçeklenebilir Doku Sıkıştırma (ASTC) için)
  • ATI doku sıkıştırma (ATC) için #tcf_atc
  • S3 DXT1 doku sıkıştırması (DXT1) için #tcf_dxt1
  • Luminance-Alpha 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
  • #tcf_etc1, Ericsson doku sıkıştırma (ETC1) için
  • #tcf_etc2, Ericsson doku sıkıştırma 2 (ETC2) için
  • 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 yayınlama kuralları

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

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

Uygulama paketindeki doku biçimlerinden hiçbiri cihaz tarafından desteklenmiyorsa Google Play, varsayılan biçimde paketlenmiş doku biçimlerini sunar. (Belirli cihaz donanımlarını hedeflemiyorsanız ETC1 veya ETC2, varsayılan biçim için iyi seçeneklerdir.) Öğeleri varsayılan biçimde paketleme hakkında bilgi edinmek için bundletool'u kullanma veya Google Play Unity eklentisini kullanma başlıklı makaleyi inceleyin.

Öğeler varsayılan bir biçimde paketlenmemişse Google Play, uygulamayı cihaz için kullanılamaz olarak işaretler. Bu durumda kullanıcılar uygulamayı indiremez.

Biçim (tcf_xxxx olarak belirtilir) 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
atc GL_AMD_compressed_ATC_texture
3dc GL_AMD_compressed_3DC_texture
etc2 Geçerli değil. Cihaz, OpenGL ES 3.0 veya sonraki sürümleri desteklemelidir.
etc1 GL_OES_compressed_ETC1_RGB8_texture
paletli GL_OES_compressed_paletted_texture