Level up your Unity Web builds
Посматриваю контент с Unite 2025. Подумал полезным подсветить пару моментов из этого доклада и дополнить комментариями.
1 Addressables для контента
Использование Addressables для всего контента — реально очень важно для веба на Unity.
В отличие от JS-движков, где весь контент может грузиться по востребованию, в Unity весь in-game content вне бандлов улетит в .data-файл, который пользователям придётся полностью загрузить перед тем, как попасть в игру.
Больше файл -> дольше первая загрузка -> меньше игроков.
☝ Мало всё выкинуть в бандлы, нужно ещё и выстроить процесс так, чтобы обращение к контенту происходило только тогда, когда он реально нужен.
Иначе, например, вместе с .data придётся и бандлы грузить: то на то и выйдет.
☝ Важно не просто обратиться к динамическому контенту вовремя, а обратиться своевременно, чтобы он успел загрузиться к моменту реальной необходимости.
☝ Нужно ведь ещё и выгрузить контент из памяти вовремя, чтобы не упереться в ограничения, которые у браузеров достаточно жёсткие и плавающие.
Принято считать 2 Гб верхней планкой, но эта планка в ряде случаев может очень сильно снижаться.
И т.к. выгрузка (да и загрузка тоже) контента с Addressables — это очень "увлекательно", то этим лучше заниматься с самого начала разработки.
Иначе и в .data, и в памяти будет висеть вечный тех долг.
2 Особенности бандлов в вебе
По умолчанию в Unity бандлы, включенные в билд, складываются в Streaming Assets. Т.е. в папочку с билдом. И хоть это является формально частью сборки, это всё же отдельные файлы от .data-файла.
Это важно в том контексте, что игра загрузит сразу только необходимые файлы. В т.ч. .data-файл. Но не содержимое Streaming Assets. Файлы бандлов игра будет грузить по востребованию.
Т.е. даже без настройки отдельного CDN для бандлов и Remote доступа, просто даже с Local бандлами, мы уже можем сокращать время загрузки и урезать .data. Ложка мёда в бочке веба.
3 KTX2
Про KTX2 важно знать. KTX2 лучше жмётся, меньше потребляет памяти, быстрее загружается и, что наверное самое важное, лучше ведёт себя на кросс-платформе (в т.ч. в рамках веба).
Например, ASTC хорошо отработает на телефоне, но десктоп не сможет его прожевать и декодирует в RGBA. И аналогично с остальными форматами. Это выливается в повышенную нагрузку и лишнее потребление памяти на проблемных платформах.
Тут приходится либо какой-то платформой жертвовать, либо делать разные паки бандлов, что усложняет настройку, сборку и доставку.
Ранее я для Unity находил только этот репозиторий. Было страшно его затаскивать и ломать все процессы, т.к. Unity не поддерживает этот формат, и всю загрузку с подключением нужно реализовывать динамически через код.
Но в UPM засветился официальный пакет. Проблемы с использованием он похоже пока не решает, но хотя бы появляется чуть больше уверенности в источнике.
Будет повод вернуться к этому вопросу снова.