Текстуры — это изображения, которые можно нанести на поверхность 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.
Используйте Градл
Обновите версию плагина Android Gradle в файле
build.gradle
вашего проекта до 4.1 или выше (например,com.android.tools.build:gradle:4.1.0
).Определите набор типов устройств, которые вы хотите использовать в своей игре, и поддерживаемые ими форматы сжатия текстур (дополнительную информацию о форматах см. в разделе «Справочная информация »).
Создайте версии своих ресурсов для каждого формата сжатия текстур из предыдущего шага. Это может включать в себя создание листов спрайтов с использованием такого программного обеспечения, как TexturePacker , или запуск сценария, который преобразует необработанные ресурсы в ресурсы определенного формата (например, astc-encoder ).
Создавайте пакеты ресурсов (см. раздел Сборка для C++ или Java ), которые содержат игровые ресурсы и используются службой Play Asset Delivery. Например, вы можете создать один пакет ресурсов для каждого уровня или пакеты ресурсов для разных частей вашей игры.
Добавьте в свои пакеты ресурсов каталоги для каждого формата сжатия текстур, который вы хотите поддерживать. Добавьте поддерживаемые суффиксы к именам каталогов текстур, которые соответствуют формату сжатия текстур, используемому для содержащихся файлов.
Создайте каталог без суффикса в имени (например,
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/...Обновите файл
build.gradle
вашего приложения, чтобы включить разделение пакетов ресурсов по текстурам .// In the app build.gradle file: android { ... bundle { texture { enableSplit true } } }
В Android Studio выберите «Сборка» > «Создать подписанный пакет / APK» или запустите задачу Gradle из командной строки, чтобы сгенерировать пакет.
Используйте плагин Google Play Unity.
Получите плагин (или пакет) Unity для Play Asset Delivery, чтобы создать пакет приложений с пакетами ресурсов, ориентированными на текстуры.
Подготовьте активы
Чтобы подготовить ресурсы текстур для создания пакета приложений, выполните следующие действия:
Упакуйте свою сцену и ресурсы в несколько Unity AssetBundles .
Определите набор типов устройств, которые вы хотите использовать в своей игре, и поддерживаемые ими форматы сжатия текстур (дополнительную информацию о форматах см. в разделе «Справочная информация »).
Измените сценарий сборки вашей игры, чтобы он генерировал 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. } }
Убедитесь, что каждый ресурс текстуры выводится в каталог с правильным суффиксом в имени (например,
#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
Выберите Google > Android > Доставка активов .
Нажмите «Добавить папку» , чтобы добавить папку, содержащую пакеты ресурсов по умолчанию. Эти пакеты устанавливаются на устройства, которые не поддерживают другие определяемые вами форматы.
Обязательно установите режим доставки для AssetBundle.
Нажмите «Добавить папку» , чтобы добавить папку, содержащую AssetBundles, созданную для другого формата (например, ASTC). Повторите по мере необходимости.
Обязательно установите режим доставки для каждого AssetBundle.
Строить
Выберите Google > Build Android App Bundle, чтобы запустить сборку вашей игры на Unity. Он также упаковывает AssetBundles в несколько пакетов ресурсов, где каждое имя AssetBundle преобразуется в один пакет ресурсов.
(Дополнительно) Использование Bundletool
Дополнительные сведения о bundletool
см. в разделе Создание пакета приложения с помощью Bundletool .
Чтобы создать пакет приложений, выполните следующие действия:
Загрузите
bundletool
из репозитория GitHub.Определите набор типов устройств, которые вы хотите использовать в своей игре, и поддерживаемые ими форматы сжатия текстур (дополнительную информацию о форматах см. в разделе «Справочная информация »).
Создайте версии своих ресурсов для каждого формата сжатия текстур из предыдущего шага. Это может включать в себя создание листов спрайтов с использованием такого программного обеспечения, как TexturePacker , или запуск сценария, который преобразует необработанные ресурсы в ресурсы определенного формата (например, astc-encoder ).
Создавайте пакеты ресурсов (см. раздел Сборка для C++ или Java ), которые содержат игровые ресурсы и используются службой Play Asset Delivery. Например, вы можете создать один пакет ресурсов для каждого уровня или пакеты ресурсов для разных частей вашей игры.
В различных пакетах ресурсов добавляйте поддерживаемые суффиксы к именам каталогов текстур, которые соответствуют формату сжатия текстур, используемому для содержащихся файлов.
Создайте каталог без суффикса в имени (например,
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/...Добавьте измерение 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) и ниже. В приведенной выше таблице примера на этих устройствах установлена версия текстур по умолчанию; в большинстве случаев это предполагаемое поведение.Создайте пакет приложений:
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-файлы, установленные для вашего устройства, в каталог, а затем проверьте этот каталог.Извлеките спецификацию вашего устройства:
bundletool get-device-spec --output=MY_DEVICE_SPEC.json
Запустите
bundletool extract-apks
со следующей спецификацией устройства:bundletool extract-apks --apks=APKS.apks --device-spec=MY_DEVICE_SPEC.json \ --output-dir out
Перечислите файлы в
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 |