Kierowanie na formaty kompresji tekstur w pakietach Android App Bundle

Tekstury to obrazy, które można zastosować na powierzchni modelu 3D. Tekstury są również używane przez mechanizmy renderowania 2D do rysowania elementów, takich jak sprites czy tło. Na tej stronie opisujemy popularne formaty kompresji tekstur używane w grach oraz instrukcje kierować na nie za pomocą pakietów Android App Bundle. Odczytano Informacje o pakietach Android App Bundle Zanim zaczniesz, Play Asset Delivery Google.

Tło

Procesory graficzne zazwyczaj obsługują zestaw formatów kompresji tekstur. O Format kompresji tekstur (TCF) to format pliku zoptymalizowany pod kątem procesorów graficznych. GPU ładuje i renderuje teksturę szybciej i z mniejszą ilością pamięci, niż gdyby korzystali z tablicy wartości RGBA w pamięci. Ta pomoc jest świadczona w poziom sprzętowy: producent GPU umieszcza komponenty w kartach graficznych. który odczytuje, dekompresuje i renderuje obsługiwane formaty.

Oto popularne formaty kompresji tekstur na nowoczesnym sprzęcie mobilnym:

  • ASTC: najnowszy format służący do zastąpienia poprzednich formatów. Większa elastyczność niż ze względu na obsługę różnych rozmiarów bloków. Używanie tego formatu to dobry sposób na optymalizację rozmiaru gry.
  • ETC2: obsługiwane przez wszystkie urządzenia obsługujące OpenGL ES 3.0 lub nowszy. Dotyczy to prawie wszystkich aktywnych urządzeń mobilnych z Androidem.

Te formaty są obsługiwane przez następujące przybliżone wartości procentowe Androida urządzenia:

Format kompresji tekstur Odsetek urządzeń z Google Play obsługujących obsługę
protokół ATC >80%
elektroniczny pobór opłat drogowych (ETC2) >95%

Procesory graficzne do komputerów stacjonarnych z Grami Google Play na PC obsługują też ten format:

  • DDS lub S3TC: czasami nazywane BCn, DXTC lub DXTn.

Starsze, niezalecane formaty kompresji tekstur to między innymi:

  • ETC1: obsługiwane na większości urządzeń. Ten format nie obsługuje przejrzystości, ale gry mogą używać drugiego pliku tekstury dla komponentu alfa.
  • PVRTC: popularny w grach na iOS, a także obsługiwany przez niektóre urządzenia z Androidem.

Obsługa ETC1 jest wymagana tylko w przypadku gier obsługujących bardzo stare wersje tych urządzeń ani na wybranych urządzeniach z Androidem TV, które nie obsługują interfejsów OpenGL ES 3.0 i wyżej.

Format domyślny

Jest tak wiele formatów (o różnym poziomie obsługi na różnych urządzeniach), mogą nie wiedzieć, których formatów użyć podczas tworzenia tekstur gry. Jako zabezpieczenie, format pakietu aplikacji pozwala wybrać domyślną kompresję tekstury dla każdego pakietu zasobów. Jeśli urządzenie nie obsługuje innego wymienionego urządzenia , instalowane są zasoby korzystające z tego formatu domyślnego.

Jeśli nie kierujesz reklam na bardzo stary sprzęt, dobrym rozwiązaniem będzie ETC2. dla formatu domyślnego. Należy używać formatów ETC2, które zapewniają zgodność obsługiwane przez OpenGL ES 3.0. Te formaty są również dostępne w interfejsie API grafiki Vulkan.

Format ASTC definiuje bloki kompresji o różnych rozmiarach, można wybiórczo wymienić obniżoną jakość obrazu na lepszą kompresję. W zależności od charakteru źródłowego materiału artystycznego, dla danej tekstury można wybierz mniejszy lub większy blok, aby zachować akceptowalną jakość obrazu.

Jeśli Twoja gra obsługuje Gry Google Play na PC i używa Vulkan, powinny zawierać tekstury S3TC. Formaty S3TC są obsługiwane przez z wszystkimi procesorami graficznymi w komputerach.

Utwórz pakiet aplikacji

Google Play korzysta z pakietów Android App Bundle, by generować i udostępniać zoptymalizowane pliki APK konfiguracji urządzeń poszczególnych użytkowników. Pobierają oni tylko kod i zasoby którzy grają w Twoją grę. Te zoptymalizowane pliki APK zawierają jeden zestaw tekstur zasobów formatowanych przy użyciu formatu optymalnego dla danego urządzenia.

Jeśli Twojej gry nie ma w środowisku Unity, utwórz pakiet aplikacji, korzystając z Gradle. Zaawansowani użytkownicy mogą korzystać z wersji bundletool.

Jeśli gra jest w Unity, obsługa pakietów aplikacji za pomocą Play Asset Delivery jest dostępna w Unity w wersji 2021.3 i nowszych. Więcej informacji: Dokumentacja Unity Aby utworzyć pakiet aplikacji o niższej wartości, możesz użyć wtyczki Unity. wersji Unity.

Używanie Gradle

  1. Zaktualizuj wersję wtyczki Androida do obsługi Gradle w pliku build.gradle do wersji 4.1 lub nowszej (np. com.android.tools.build:gradle:4.1.0).

  2. Określ zestaw typów urządzeń, na które chcesz kierować grę, oraz obsługiwane przez nich formaty kompresji tekstur (więcej informacji na temat patrz Informacje ogólne).

  3. Utwórz wersje zasobów dla każdego formatu kompresji tekstur ze poprzedniego kroku. Może to obejmować generowanie arkuszy sprite za pomocą oprogramowania polubienie TexturePacker lub Uruchamianie skryptu konwertującego nieprzetworzone zasoby na zasoby w określonym formacie (na przykład astc-encoder).

  4. Utwórz pakiety zasobów (zobacz Tworzenie dla języka C++ lub Javy), które zawierają zasoby gry i są używane przez Play Asset Delivery. Dla: możesz na przykład utworzyć po 1 pakiecie zasobów na każdy poziom poszczególne części gry.

  5. W pakietach zasobów dodaj katalogi dla każdego formatu kompresji tekstur które chcesz wspierać. Dodaj obsługiwane sufiksy do: nazwy katalogów tekstur powiązane z kompresją tekstury format zapisu plików.

    Utwórz katalog bez sufiksu w nazwie (na przykład common/src/main/assets/textures/). W tym katalogu umieść domyślną wartość Twoich zasobów tekstur. Ten format domyślny powinien być obsługiwany przez większości urządzeń (na przykład ETC1 lub ETC2). Jeśli urządzenie nie obsługuje inne określone formaty (np. PVRTC i ASTC w tabeli poniżej), Sklep Google Play zainstaluje ten katalog.

    Katalog przed Katalog po
    common pakiet zasobów:
    common/build.gradle
    common/src/main/assets/textures/...
    common pakiet zasobów:
    common/build.gradle
    common/src/main/assets/textures/...
    Common/src/main/assets/textures#tcf_astc/...
    common/src/main/assets/textures#tcf_pvrtc/...
    Pakiet zasobów level1:
    level1/build.gradle
    level1/src/main/assets/textures/...
    Pakiet zasobów level1:
    level1/build.gradle
    level1/src/main/assets/textures/...
    level1/src/main/assets/textures#tcf_astc/...
    level1/src/main/assets/textures#tcf_pvrtc/...
    Pakiet zasobów level2:
    level2/build.gradle
    level2/src/main/assets/textures/...
    Pakiet zasobów level2:
    level2/build.gradle
    level2/src/main/assets/textures/...
    level2/src/main/assets/textures#tcf_astc/...
    level2/src/main/assets/textures#tcf_pvrtc/...
  6. Zaktualizuj plik build.gradle aplikacji, aby umożliwić podział danych pakiety zasobów na tekstury.

    // In the app build.gradle file:
    android {
        ...
        bundle {
            texture {
                enableSplit true
            }
        }
    }
    
  7. W Android Studio wybierz kolejno Kompilacja > Wygeneruj podpisany pakiet / plik APK lub uruchom zadania Gradle z wiersza poleceń – i wygeneruj pakiet.

Korzystanie z wtyczki Google Play Unity

Pobierz wtyczkę (lub pakiet) Unity do Play Asset Delivery aby utworzyć pakiet aplikacji z pakietami zasobów kierowanymi na tekstury.

Przygotowanie zasobów

Aby przygotować zasoby tekstur do utworzenia pakietu aplikacji, wykonaj te czynności:

  1. Umieszczanie sceny i zasobów w różnych pakietach Unity AssetBundles,

  2. Określ zestaw typów urządzeń, na które chcesz kierować grę, oraz obsługiwane przez nich formaty kompresji tekstur (więcej informacji na temat patrz Informacje ogólne).

  3. Zmodyfikuj skrypt kompilacji, aby wygenerować więcej pakietów AssetBundles raz dla każdego obsługiwanego formatu tekstury. Zobacz następujący przykładowy skrypt:

    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. Sprawdź, czy każdy zasób tekstury jest zapisywany w katalogu o poprawnym sufiks w nazwie (np. #tcf_astc).

    Sprawdź, czy dane wyjściowe mają katalog bez sufiksu (na przykład Assets/AssetBundles/). Ten katalog zawiera domyślny format pliku . Ten format domyślny powinien być obsługiwany przez większość urządzeń (na np. ETC2). Jeśli urządzenie nie obsługuje innych wymienionych formatów (np. ASTC w kodzie z poprzedniego kroku), a następnie tag Google Play Sklep instaluje ten katalog.

    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. Wybierz Google > Android > Dostawa zasobów.

  6. Kliknij Dodaj folder, aby dodać folder zawierający zasób domyślny. pakiety. Te pakiety są instalowane na urządzeniach, które nie obsługują innych zdefiniowanych przez nas formatach.

    Pamiętaj, aby ustawić tryb wyświetlania dla AssetBundle.

    Domyślny format przesyłania zasobów Unity AssetBundle Delivery

  7. Kliknij Dodaj folder, aby dodać folder zawierający pakiet AssetBundles dla w innym formacie (np. ASTC). Powtórz w razie potrzeby.

    Pamiętaj, aby ustawić tryb wyświetlania dla każdego zasobu AssetBundle.

    Format ASTC Unity AssetBundle Delivery

Budowanie

Wybierz Google > Utwórz pakiet Android App Bundle, aby uruchomić kompilację Unity tę grę. Łączy także zasoby AssetBundles w kilka pakietów, z których każdy Nazwa AssetBundle jest konwertowana na pojedynczy pakiet zasobów.

(Zaawansowane) Użyj narzędzia pakietu

Więcej informacji na temat bundletool: Utwórz pakiet aplikacji za pomocą narzędzia bundletool

Aby utworzyć pakiet aplikacji:

  1. Pobierz bundletool z repozytorium GitHub.

  2. Określ zestaw typów urządzeń, na które chcesz kierować grę, oraz obsługiwane przez nich formaty kompresji tekstur (więcej informacji na temat patrz Informacje ogólne).

  3. Utwórz wersje zasobów dla każdego formatu kompresji tekstur ze poprzedniego kroku. Może to obejmować generowanie arkuszy sprite za pomocą oprogramowania polubienie TexturePacker lub Uruchamianie skryptu konwertującego nieprzetworzone zasoby na zasoby w określonym formacie (na przykład astc-encoder).

  4. Utwórz pakiety zasobów (zobacz Tworzenie dla języka C++ lub Javy), które zawierają zasoby gry i są używane przez Play Asset Delivery. Dla: możesz na przykład utworzyć po 1 pakiecie zasobów na każdy poziom poszczególne części gry.

  5. W różnych pakietach zasobów dodaj obsługiwane sufiksy z nazwami katalogów tekstur odpowiadającymi kompresji tekstury format zapisu plików.

    Utwórz katalog bez sufiksu w nazwie (na przykład common/src/main/assets/textures/). W tym katalogu umieść domyślną wartość Twoich zasobów tekstur. Ten format domyślny powinien być obsługiwany przez większości urządzeń (na przykład ETC1 lub ETC2). Jeśli urządzenie nie obsługuje inne określone formaty (np. PVRTC i ASTC w tabeli poniżej), Sklep Google Play zainstaluje ten katalog.

    Katalog przed Katalog po
    common pakiet zasobów:
    common/build.gradle
    common/src/main/assets/textures/...
    common pakiet zasobów:
    common/build.gradle
    common/src/main/assets/textures/...
    Common/src/main/assets/textures#tcf_astc/...
    common/src/main/assets/textures#tcf_pvrtc/...
    Pakiet zasobów level1:
    level1/build.gradle
    level1/src/main/assets/textures/...
    Pakiet zasobów level1:
    level1/build.gradle
    level1/src/main/assets/textures/...
    level1/src/main/assets/textures#tcf_astc/...
    level1/src/main/assets/textures#tcf_pvrtc/...
    Pakiet zasobów level2:
    level2/build.gradle
    level2/src/main/assets/textures/...
    Pakiet zasobów level2:
    level2/build.gradle
    level2/src/main/assets/textures/...
    level2/src/main/assets/textures#tcf_astc/...
    level2/src/main/assets/textures#tcf_pvrtc/...
  6. Dodaj wymiar Zasad dotyczących przejrzystości i uzyskiwania zgody na przetwarzanie danych do plik metadanych pakietu aplikacji (BundleConfig.json). Użyj aplikacji TEXTURE_COMPRESSION_FORMAT dla: value pole:

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

    Ustaw suffixStripping.enabled na true, aby usunąć sufiks (na przykład #tcf_astc) z nazw katalogów podczas generowania pakietów zasobów. Ten umożliwia grze odczytywanie plików ze znanej nazwy katalogu (np. level1/assets/textures). Niektóre silniki gier wykrywają format więc nie musisz wybierać formatu zasobów tekstur, które z którym została zainstalowana.

    suffixStripping.defaultSuffix określa domyślny sufiks katalogu, gdy bundletool generuje samodzielny plik APK na urządzenia z Androidem 5.0 (interfejs API) na poziomie 21) i niższym. Wcześniej w przykładowej tabeli domyślna wersja zasoby tekstur są zainstalowane na tych urządzeniach, jest to zamierzone co w większości przypadków.

  7. Utwórz pakiet aplikacji:

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

Sprawdzanie zawartości pakietu aplikacji

Jeśli jeszcze nie masz tego za sobą, pobierz bundletool z repozytorium GitHub.

Zweryfikuj zawartość wyjściowego pakietu aplikacji, tworząc z niego pliki APK i sprawdzając je:

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

Dane wyjściowe powinny być podobne do tych:

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

Nazwy te wskazują, że kierowanie zgodnie z Zasadami dotyczącymi przejrzystości i uzyskiwania zgody na przetwarzanie danych jest stosowane prawidłowo. Jeśli wyodrębnisz zawartość pakietu APK poziomu (np. asset-slices/level1-astc.apk), może sprawdzić, czy istnieje tylko jeden katalog o nazwie textures.

Testowanie pakietu aplikacji

Połącz urządzenie i zainstaluj odpowiednie pakiety zasobów:

bundletool install-apks --apks=APKS.apks

To polecenie instaluje tylko te pakiety zasobów, które są zgodne ze specyfikacją urządzenia. Specyfikacje te obejmują interfejs ABI, gęstość ekranu, język odpowiedni format kompresji tekstur. Ta operacja symuluje działania w Sklepie Google Play, w którym jest dostępna opublikowaną grę.

Aby sprawdzić, czy zainstalowano prawidłowe pakiety zasobów, wykonaj jedną z tych czynności:

  • Użyj polecenia bundletool extract-apks, aby wyświetlić pakiety APK zainstalowane na urządzenia do katalogu, a potem sprawdź ten katalog.

    1. Wyodrębnij specyfikację urządzenia:

      bundletool get-device-spec --output=MY_DEVICE_SPEC.json
      
    2. Uruchom bundletool extract-apks z tą specyfikacją urządzenia:

      bundletool extract-apks --apks=APKS.apks --device-spec=MY_DEVICE_SPEC.json \
          --output-dir out
      
    3. Wymień pliki w katalogu out i sprawdź, czy odpowiednie pakiety zasobów są poprawne są zainstalowane. Nazwy pakietów zasobów mają przyrostek nazwę formatu tekstur (w przypadku np. level1-astc.apk).

  • Dodaj w grze instrukcje dziennika, które podczas wczytywania będą wyświetlać format tekstury lub teksturę.

  • Wygeneruj testowy zestaw tekstur (na przykład zastąp teksturę pojedynczy jasny kolor dla danego formatu). Uruchom grę i sprawdź, czy tak jest. obecnie.

Jeśli Twoja aplikacja zawiera pakiety zasobów on-demand lub fast-follow, użyj lokalne rozwiązanie testowe do przesyłania zasobów.

Obsługiwane sufiksy dla nazw katalogów tekstur

Google Play rozpoznaje te sufiksy używane w nazwach katalogów tekstur:

  • #tcf_astc na potrzeby automatycznej kompresji tekstury (ASTC)
  • #tcf_atc – kompresja tekstury ATI (ATC)
  • #tcf_dxt1 dla kompresji tekstur S3 DXT1 (DXT1)
  • #tcf_latc dla kompresji tekstury Luminance-Alpha (LATC)
  • #tcf_paletted w przypadku ogólnej palety kolorów do kompresji
  • #tcf_pvrtc do kompresji tekstur PowerVR (PVRTC)
  • #tcf_etc1 dla kompresji tekstury Ericssona (ETC1)
  • #tcf_etc2 dla kompresji tekstury Ericsson 2 (ETC2)
  • #tcf_s3tc do kompresji tekstur S3 (S3TC)
  • #tcf_3dc – kompresja tekstury ATI 3Dc (3Dc)

Reguły wyświetlania w Google Play

Google Play sprawdza ciągi rozszerzeń OpenGL używane przez urządzenie oraz Wersja OpenGL obsługiwana przez urządzenie. Google Play wykorzystuje te informacje do: określać właściwy format tekstury, który zostanie przesłany na urządzenie z Androida pakiet aplikacji.

Google Play udostępnia pierwszy format w tej kolejności: obsługiwanej przez urządzenie.

Jeśli urządzenie nie obsługuje żadnego z formatów tekstur z pakietu aplikacji, Google Play udostępnia formaty tekstur spakowane w formacie domyślnym. (Jeśli nie kierujesz reklam na konkretny sprzęt urządzenia, wartości ETC1 lub ETC2 będą dobre opcje formatu domyślnego). Informacje o tym, jak spakować zasoby w domyślnego formatu, zobacz Korzystanie z narzędzia bundletool lub Użyj wtyczki Google Play Unity.

Jeśli zasoby nie zostały spakowane w formacie domyślnym, Google Play oznaczy aplikację jako jako niedostępne dla tego urządzenia. W takim przypadku użytkownicy nie będą mogli pobrać aplikacji.

Format (określony w języku: tcf_xxxx) Obsługiwane na urządzeniach z obsługą OpenGL ciąg rozszerzenia
Asc 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
3 DC GL_AMD_compressed_3DC_texture
itd. Nie dotyczy. Urządzenie musi obsługa standardu OpenGL ES w wersji 3.0 lub później.
itd. GL_OES_compressed_ETC1_RGB8_texture
wypalone GL_OES_compressed_paletted_texture