Целевые форматы сжатия текстур в наборах приложений Android

Текстуры — это изображения, которые можно нанести на поверхность 3D-модели. Текстуры также используются средствами 2D-рендеринга для рисования таких элементов, как спрайты или фоны. На этой странице описаны популярные форматы сжатия текстур, используемые в играх, и способы их использования в наборах приложений для Android. Прежде чем приступить к работе с этим руководством, прочтите о наборах приложений для Android и доставке ресурсов Play .

Фон

Графические процессоры обычно поддерживают набор форматов сжатия текстур. Формат сжатия текстур (или TCF) — это формат файла, оптимизированный для графических процессоров. Графический процессор загружает и визуализирует текстуру быстрее и с меньшим объемом памяти, чем если бы он использовал в памяти массив значений RGBA. Эта поддержка осуществляется на аппаратном уровне: производитель графического процессора встраивает в чип видеокарты компоненты, которые считывают, распаковывают и отображают поддерживаемые форматы.

Ниже приведены распространенные форматы сжатия текстур на современном мобильном оборудовании:

  • ASTC: Последний формат, разработанный для замены предыдущих форматов. Более гибкий, чем предыдущие форматы, благодаря поддержке блоков различных размеров. Использование этого формата — хороший способ оптимизировать размер вашей игры.
  • ETC2: поддерживается всеми устройствами, поддерживающими OpenGL ES 3.0 и выше. Сюда входят почти все активные мобильные устройства Android.

Эти форматы поддерживаются следующим приблизительным процентом устройств Android:

Формат сжатия текстур Процент устройств Google Play с поддержкой
АСТК >80%
И Т.Д.2 >95%

Графические процессоры настольных компьютеров, на которых работают Google Play Games для ПК, также поддерживают этот формат:

  • DDS или S3TC: иногда называется BCn, DXTC или DXT n .

К старым, больше не рекомендуемым форматам сжатия текстур относятся:

  • ETC1: поддерживается на большинстве устройств. Этот формат не поддерживает прозрачность, но игры могут использовать второй файл текстуры для альфа-компонента.
  • PVRTC: популярен в играх для iOS, а также поддерживается на некоторых устройствах Android.

Поддержка ETC1 требуется только для игр, поддерживающих очень старые устаревшие устройства, или для некоторых устройств Android TV, которые не поддерживают OpenGL ES 3.0 и выше.

Формат по умолчанию

При таком большом количестве доступных форматов (с разным уровнем поддержки устройств) вы можете не знать, какие форматы использовать при создании игровых текстур. В целях безопасности формат пакета приложений позволяет вам выбрать формат сжатия текстур по умолчанию для каждого пакета ресурсов. Если устройство не поддерживает другие указанные форматы, устанавливаются ресурсы, использующие этот формат по умолчанию.

Если вы не ориентируетесь на очень старое оборудование устройства, ETC2 — хороший выбор в качестве формата по умолчанию. Вам следует использовать форматы ETC2, которые гарантированно поддерживаются в OpenGL ES 3.0 . Эти форматы также доступны в графическом API Vulkan.

Формат ASTC определяет различные размеры блоков сжатия, которые позволяют выборочно обменивать пониженное качество изображения на большее сжатие. В зависимости от характера исходного художественного материала для данной текстуры вы можете выбрать меньший или больший размер блока, чтобы сохранить приемлемое визуальное качество.

Если ваша игра поддерживает Google Play Games для ПК и использует Vulkan, вам следует включить текстуры S3TC. Форматы S3TC поддерживаются всеми графическими процессорами настольных компьютеров.

Создайте пакет приложений

Google Play использует пакеты приложений Android для создания и предоставления оптимизированных APK-файлов для конфигурации устройства каждого пользователя, поэтому пользователи загружают только тот код и ресурсы, которые им необходимы для запуска вашей игры. Эти оптимизированные APK-файлы включают в себя единый набор текстур, отформатированных с использованием оптимального формата сжатия для устройства.

Если ваша игра не на Unity, используйте Gradle для создания пакета приложений. Опытные пользователи могут захотеть использовать bundletool .

Если ваша игра написана на Unity, поддержка пакетов приложений с Play Asset Delivery доступна в Unity 2021.3 и более поздних версиях. Дополнительную информацию смотрите в документации Unity . Вы можете использовать плагин Unity для создания пакета приложений с более ранними версиями Unity.

Используйте Градл

  1. Обновите версию плагина Android Gradle в файле build.gradle вашего проекта до 4.1 или выше (например, com.android.tools.build:gradle:4.1.0 ).

  2. Определите набор типов устройств, которые вы хотите использовать в своей игре, и поддерживаемые ими форматы сжатия текстур (дополнительную информацию о форматах см. в разделе «Справочная информация »).

  3. Создайте версии своих ресурсов для каждого формата сжатия текстур из предыдущего шага. Это может включать в себя создание листов спрайтов с использованием такого программного обеспечения, как TexturePacker , или запуск сценария, который преобразует необработанные ресурсы в ресурсы определенного формата (например, astc-encoder ).

  4. Создавайте пакеты ресурсов (см. раздел Сборка для C++ или Java ), которые содержат игровые ресурсы и используются службой Play Asset Delivery. Например, вы можете создать один пакет ресурсов для каждого уровня или пакеты ресурсов для разных частей вашей игры.

  5. Добавьте в свои пакеты ресурсов каталоги для каждого формата сжатия текстур, который вы хотите поддерживать. Добавьте поддерживаемые суффиксы к именам каталогов текстур, которые соответствуют формату сжатия текстур, используемому для содержащихся файлов.

    Создайте каталог без суффикса в имени (например, common/src/main/assets/textures/ ). В этот каталог поместите формат по умолчанию для ваших текстурных ресурсов. Этот формат по умолчанию должен поддерживаться большинством устройств (например, ETC1 или ETC2). Если устройство не поддерживает другие указанные форматы (например, PVRTC и ASTC в таблице ниже), Google Play Store устанавливает вместо этого этот каталог.

    Каталог до Каталог после
    common пакет активов :
    общий/build.gradle
    общий/источник/основной/активы/текстуры/...
    common пакет активов :
    общий/build.gradle
    общий/источник/основной/активы/текстуры/...
    common/src/main/assets/textures#tcf_astc/...
    common/src/main/assets/textures#tcf_pvrtc/...
    пакет активов level1 :
    уровень1/build.gradle
    level1/src/main/assets/textures/...
    пакет активов level1 :
    уровень1/build.gradle
    level1/src/main/assets/textures/...
    level1/src/main/assets/textures#tcf_astc/...
    level1/src/main/assets/textures#tcf_pvrtc/...
    пакет ресурсов level2 :
    уровень2/build.gradle
    level2/src/main/assets/textures/...
    пакет ресурсов level2 :
    уровень2/build.gradle
    level2/src/main/assets/textures/...
    level2/src/main/assets/textures#tcf_astc/...
    level2/src/main/assets/textures#tcf_pvrtc/...
  6. Обновите файл build.gradle вашего приложения, чтобы включить разделение пакетов ресурсов по текстурам .

    // In the app build.gradle file:
    android {
        ...
        bundle {
            texture {
                enableSplit true
            }
        }
    }
    
  7. В Android Studio выберите «Сборка» > «Создать подписанный пакет / APK» или запустите задачу Gradle из командной строки, чтобы сгенерировать пакет.

Используйте плагин Google Play Unity.

Получите плагин (или пакет) Unity для Play Asset Delivery, чтобы создать пакет приложений с пакетами ресурсов, ориентированными на текстуры.

Подготовьте активы

Чтобы подготовить ресурсы текстур для создания пакета приложений, выполните следующие действия:

  1. Упакуйте свою сцену и ресурсы в несколько Unity AssetBundles .

  2. Определите набор типов устройств, которые вы хотите использовать в своей игре, и поддерживаемые ими форматы сжатия текстур (дополнительную информацию о форматах см. в разделе «Справочная информация »).

  3. Измените сценарий сборки вашей игры, чтобы он генерировал AssetBundles несколько раз, по одному для каждого формата текстур, который вы хотите поддерживать. См. следующий пример сценария:

    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. Убедитесь, что каждый ресурс текстуры выводится в каталог с правильным суффиксом в имени (например, #tcf_astc ).

    Убедитесь, что выводится каталог без суффикса в имени (например, Assets/AssetBundles/ ). Этот каталог содержит формат ваших текстур по умолчанию. Этот формат по умолчанию должен поддерживаться большинством устройств (например, ETC2). Если устройство не поддерживает другие указанные форматы (например, ASTC в коде из предыдущего шага), то вместо этого Google Play Store устанавливает этот каталог.

    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 > Доставка активов .

  6. Нажмите «Добавить папку» , чтобы добавить папку, содержащую пакеты ресурсов по умолчанию. Эти пакеты устанавливаются на устройства, которые не поддерживают другие определяемые вами форматы.

    Обязательно установите режим доставки для AssetBundle.

    Формат доставки Unity AssetBundle по умолчанию

  7. Нажмите «Добавить папку» , чтобы добавить папку, содержащую AssetBundles, созданную для другого формата (например, ASTC). Повторите по мере необходимости.

    Обязательно установите режим доставки для каждого AssetBundle.

    Доставка Unity AssetBundle в формате ASTC

Строить

Выберите Google > Build Android App Bundle, чтобы запустить сборку вашей игры на Unity. Он также упаковывает AssetBundles в несколько пакетов ресурсов, где каждое имя AssetBundle преобразуется в один пакет ресурсов.

(Дополнительно) Использование Bundletool

Дополнительные сведения о bundletool см. в разделе Создание пакета приложения с помощью Bundletool .

Чтобы создать пакет приложений, выполните следующие действия:

  1. Загрузите bundletool из репозитория GitHub.

  2. Определите набор типов устройств, которые вы хотите использовать в своей игре, и поддерживаемые ими форматы сжатия текстур (дополнительную информацию о форматах см. в разделе «Справочная информация »).

  3. Создайте версии своих ресурсов для каждого формата сжатия текстур из предыдущего шага. Это может включать в себя создание листов спрайтов с использованием такого программного обеспечения, как TexturePacker , или запуск сценария, который преобразует необработанные ресурсы в ресурсы определенного формата (например, astc-encoder ).

  4. Создавайте пакеты ресурсов (см. раздел Сборка для C++ или Java ), которые содержат игровые ресурсы и используются службой Play Asset Delivery. Например, вы можете создать один пакет ресурсов для каждого уровня или пакеты ресурсов для разных частей вашей игры.

  5. В различных пакетах ресурсов добавляйте поддерживаемые суффиксы к именам каталогов текстур, которые соответствуют формату сжатия текстур, используемому для содержащихся файлов.

    Создайте каталог без суффикса в имени (например, common/src/main/assets/textures/ ). В этот каталог поместите формат по умолчанию для ваших текстурных ресурсов. Этот формат по умолчанию должен поддерживаться большинством устройств (например, ETC1 или ETC2). Если устройство не поддерживает другие указанные форматы (например, PVRTC и ASTC в таблице ниже), Google Play Store устанавливает вместо этого этот каталог.

    Каталог до Каталог после
    common пакет активов :
    общий/build.gradle
    общий/источник/основной/активы/текстуры/...
    common пакет активов :
    общий/build.gradle
    общий/источник/основной/активы/текстуры/...
    common/src/main/assets/textures#tcf_astc/...
    common/src/main/assets/textures#tcf_pvrtc/...
    пакет активов level1 :
    уровень1/build.gradle
    level1/src/main/assets/textures/...
    пакет активов level1 :
    уровень1/build.gradle
    level1/src/main/assets/textures/...
    level1/src/main/assets/textures#tcf_astc/...
    level1/src/main/assets/textures#tcf_pvrtc/...
    пакет ресурсов level2 :
    уровень2/build.gradle
    level2/src/main/assets/textures/...
    пакет ресурсов level2 :
    уровень2/build.gradle
    level2/src/main/assets/textures/...
    level2/src/main/assets/textures#tcf_astc/...
    level2/src/main/assets/textures#tcf_pvrtc/...
  6. Добавьте измерение TCF в файл метаданных пакета приложения ( BundleConfig.json ). Используйте TEXTURE_COMPRESSION_FORMAT для поля value :

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

    Установите для suffixStripping.enabled значение true чтобы удалить суффикс (например, #tcf_astc ) из имен каталогов при создании пакетов ресурсов. Это позволит вашей игре читать файлы из каталога с известным именем (например level1/assets/textures ). Некоторые игровые движки могут определять формат файла, поэтому вашей игре может быть безразличен формат текстурных ресурсов, с которыми она была установлена.

    suffixStripping.defaultSuffix указывает суффикс каталога по умолчанию, когда bundletool создает автономный APK для устройств под управлением Android 5.0 (уровень API 21) и ниже. В приведенной выше таблице примера на этих устройствах установлена ​​версия текстур по умолчанию; в большинстве случаев это предполагаемое поведение.

  7. Создайте пакет приложений:

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

Проверьте содержимое пакета приложения

Если вы еще этого не сделали, загрузите bundletool из репозитория GitHub.

Проверьте содержимое выходного пакета приложений, создав из него APK-файлы и проверив их:

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

Вывод должен быть похож на следующий:

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

Эти имена указывают на то, что таргетинг TCF применяется правильно. Если вы извлекаете содержимое APK уровня (например, asset-slices/level1-astc.apk ), вы можете убедиться, что присутствует только один каталог с textures .

Протестируйте пакет приложений

Подключите устройство и установите соответствующие пакеты ресурсов:

bundletool install-apks --apks=APKS.apks

Эта команда устанавливает только те пакеты ресурсов, которые соответствуют спецификации устройства. Эти спецификации включают ABI, плотность экрана, язык и наиболее подходящий формат сжатия текстур. Эта операция имитирует действия Google Play Store для вашей опубликованной игры.

Чтобы убедиться, что установлены правильные пакеты ресурсов, выполните одно из следующих действий:

  • Используйте команду bundletool extract-apks чтобы вывести APK-файлы, установленные для вашего устройства, в каталог, а затем проверьте этот каталог.

    1. Извлеките спецификацию вашего устройства:

      bundletool get-device-spec --output=MY_DEVICE_SPEC.json
      
    2. Запустите bundletool extract-apks со следующей спецификацией устройства:

      bundletool extract-apks --apks=APKS.apks --device-spec=MY_DEVICE_SPEC.json \
          --output-dir out
      
    3. Перечислите файлы в out каталоге и убедитесь, что установлены правильные пакеты ресурсов. Имена пакетов ресурсов добавляются к имени формата текстуры (например, level1-astc.apk ).

  • Добавьте в свою игру операторы журнала, которые выводят формат текстуры при загрузке текстуры.

  • Создайте тестовый набор текстур (например, замените текстуру одним ярким цветом для данного формата). Запустите игру и убедитесь, что она присутствует.

Если ваше приложение содержит пакеты ресурсов on-demand или fast-follow , используйте локальное решение для тестирования для доставки ресурсов .

Поддерживаемые суффиксы для имен каталогов текстур.

Google Play понимает следующие суффиксы, используемые в именах каталогов текстур:

  • #tcf_astc для адаптивного масштабируемого сжатия текстур (ASTC)
  • #tcf_atc для сжатия текстур ATI (ATC)
  • #tcf_dxt1 для сжатия текстур S3 DXT1 (DXT1)
  • #tcf_latc для сжатия текстур Luminance-Alpha (LATC)
  • #tcf_paletted для сжатия текстур с использованием общей палитры.
  • #tcf_pvrtc для сжатия текстур PowerVR (PVRTC)
  • #tcf_etc1 для сжатия текстур Ericsson (ETC1)
  • #tcf_etc2 для сжатия текстур Ericsson 2 (ETC2)
  • #tcf_s3tc для сжатия текстур S3 (S3TC)
  • #tcf_3dc для сжатия текстур ATI 3Dc (3Dc)

Правила обслуживания Google Play

Google Play проверяет строки расширения OpenGL, используемые устройством, и версию OpenGL, поддерживаемую устройством. Google Play использует эту информацию, чтобы определить правильный формат текстур для доставки на устройство из пакета Android App Bundle.

Google Play предоставляет первый формат в порядке, указанном в следующей таблице, который поддерживается устройством.

Если ни один из форматов текстур в App Bundle не поддерживается устройством, Google Play доставляет форматы текстур, упакованные в формате по умолчанию . (Если вы не ориентируетесь на конкретное оборудование устройства, ETC1 или ETC2 являются хорошим выбором для формата по умолчанию.) Информацию о том, как упаковать ресурсы в формате по умолчанию, см. в разделе «Использование Bundletool» или «Использование плагина Google Play Unity» .

Если ресурсы не были упакованы в формате по умолчанию, Google Play помечает приложение как недоступное для устройства. В этом случае пользователи не смогут загрузить приложение.

Формат (обозначается в tcf_xxxx ) Поддерживается на устройствах со строкой расширения OpenGL.
АСТК GL_KHR_texture_compression_astc_ldr
пвртк GL_IMG_texture_compression_pvrtc
s3tc GL_EXT_texture_compression_s3tc
dxt1 GL_EXT_texture_compression_dxt1
латк GL_EXT_texture_compression_latc
УВД GL_AMD_compressed_ATC_texture
3dc GL_AMD_compressed_3DC_texture
и т. д. 2 Непригодный. Устройство должно поддерживать OpenGL ES версии 3.0 или новее.
и т.д.1 GL_OES_compressed_ETC1_RGB8_texture
палитра GL_OES_compressed_paletted_texture