Адресаты: Планирование и передовой опыт

Сегодня игры стали больше, чем когда-либо. По мере освоения возможностей современного аппаратного обеспечения устройств разработчикам становится все более важно эффективно управлять контентом во время выполнения. А поскольку издатели стремятся оптимизировать показатели удержания и монетизации своих игр, небольшой игровой клиент и динамические обновления контента по воздуху стали базовыми требованиями для многих успешных игр.
Unity - это комплексная система, помогающая разработчикам и издателям добиться успеха на современном игровом рынке. Этот конвейер начинается и заканчивается Addressables, пакетом Unity, который был запущен в 2019 году и на данный момент используется в тысячах успешных игр и десятках тысяч других в разработке.
Пакет Addressables предоставляет пользовательский интерфейс (UI) и API для организации активов Unity, которые будут встраиваться в AssetBundles и динамически загружаться и выгружаться во время выполнения. Независимо от того, поставляются ли AssetBundles вместе с базовой игрой или размещаются и доставляются из удаленной сети доставки контента (CDN), например Cloud Content Delivery, Addressables поможет вам загрузить необходимые активы только тогда, когда они вам нужны.
Хотя система Addressables может упростить многие аспекты управления контентом, она не является функцией "установи и забудь". Выбор способа организации, создания, загрузки и выгрузки адресуемых активов существенно влияет на размер и производительность игры.
В этом руководстве рассматриваются некоторые из наиболее важных факторов, которые необходимо учитывать, чтобы вы могли получить максимальную отдачу от системы Addressables. В конце этого блога вы найдете полезные "шпаргалки", содержащие общие настройки и рекомендации по стратегии на основе распространенных случаев использования Addressables.
Конечно, лучшая стратегия будет зависеть от игры, которую вы создаете, и ваших целей. Рассматривайте это руководство как справочник, который следует использовать вместе с материалами Unity Learn, документацией Unity Manual и форумом сообщества по Addressables.
По своей сути Addressables - это инструмент для создания и работы с AssetBundles. Прежде чем погрузиться в интерфейс Addressables UI и API, важно ознакомиться с форматом архивных файлов AssetBundles и некоторыми последствиями его использования во время выполнения.
AssetBundles можно рассматривать как контейнеры - это архивные файлы, созданные для ваших целевых платформ, которые могут содержать такие активы, как модели, текстуры, префабы, объекты ScriptableObjects, аудиоклипы и даже целые сцены, которые Unity может загружать во время выполнения.
Ключевой особенностью AssetBundles является то, что они могут выражать зависимости друг от друга. Например, AssetBundle 1 может содержать префаб, который зависит от текстуры в AssetBundle 2. Когда вы используете Addressables для загрузки префаба во время выполнения, система Addressables автоматически загрузит AssetBundle 2 и зависимую текстуру в память. И если в AssetBundle 1 есть другой актив, который зависит от актива в AssetBundle 3, AssetBundle 3 также будет загружен в память, и так далее.

Когда ваша игра запущена, система Addressables отслеживает активные ссылки на все активы, включая зависимые активы, такие как текстура, о которой говорилось выше, чтобы определить, какие из них должны находиться в памяти. Актив, загруженный из AssetBundle, не может быть освобожден из памяти, пока количество ссылок на него и все остальные активы в том же AssetBundle не станут равны 0. Сам AssetBundle может быть освобожден из памяти только тогда, когда количество ссылок на все активы в AssetBundle будет равно 0.
Учитывая эту тесную связь между Addressables и AssetBundles, самое важное правило при организации содержимого Addressables - создавать AssetBundles, содержащие отдельные наборы активов, которые, как вы ожидаете, будут загружаться и выгружаться вместе.
Самое важное решение, которое вы, скорее всего, примете при использовании Addressables, - как организовать ваши активы в группы Addressables. Вот несколько вопросов, над которыми стоит задуматься:
- Следует ли вам создать много малых групп или меньшее количество больших?
- Для каждой группы сколько AssetBundles вы должны стремиться создать (т. е. упаковать активы в этой группе вместе, отдельно или по меткам)?
- Нужно ли использовать этикетки?
- Следует ли указывать группам локальные или удаленные пути загрузки?
Хотя мы бы с радостью дали единый ответ, лучшая стратегия группировки адресов будет зависеть от нескольких факторов, характерных именно для вашей игры.
Помните: Группы адресных активов обеспечивают организационную структуру для ваших адресных активов, которая определяет , как эти активы будут встраиваться в AssetBundles. Поэтому лучшей организационной стратегией будет та, которая наиболее эффективно упаковывает, загружает и выгружает ваши AssetBundles, основываясь на уникальной структуре, целях и ограничениях вашей игры.
Прежде чем приступить к организации адресного контента, убедитесь, что вы хорошо знаете следующее:
1. Структура и дорожная карта вашей игры
2. Сильные и слабые стороны платформы вашей игры
3. Ваша главная цель (цели) в использовании Addressables для оптимизации производительности вашей игры
Ниже мы рассмотрим каждый из этих факторов.
Первый фактор, который необходимо учитывать, - это структура и дорожная карта вашей игры.
Под "структурой" мы подразумеваем фактическую архитектуру вашей игры. Является ли ваша игра линейной, однопользовательской, где игрок будет проходить через предсказуемый набор уровней или окружений? Это мультиплатформенная PvP-игра с тысячами тщеславных предметов, которые могут появиться в непредсказуемое время? Структура вашей игры определяет, когда вам нужно иметь загруженные и готовые к использованию активы, а когда вы сможете выгружать активы и AssetBundles из памяти.
Помните, что старайтесь создавать AssetBundles, содержащие только те активы, которые должны быть загружены вместе и могут быть выгружены вместе. Если ваша игра представляет собой линейное путешествие с определенными точками перелома, подумайте о том, чтобы организовать группы Addressables в более крупные подгруппы контента, связанные с каждым разделом игры. Таким образом, эти активы можно загружать и разгружать вместе.
Если ваша игра нелинейна и более непредсказуема, выбирайте меньшие группы, которые будут генерировать меньшие AssetBundles, что позволит вам загружать и выгружать их более динамично. Всегда старайтесь использовать логичные и осмысленные названия для групп, чтобы помочь вам быстро находить активы и оптимизировать расположение.
Под "дорожной картой" понимается то, как будет развиваться ваша игра с течением времени. После того как ваша игра будет отправлена игрокам, она останется в основном неизменной, за исключением периодических исправлений ошибок или исправлений игрового баланса? Или вы рассчитываете регулярно добавлять новый контент, не требуя от игроков установки большого обновления клиента?
Дорожная карта контента помогает определить стратегию группировки. Если контент вашей игры будет самодостаточным и не будет обновляться после запуска, ориентируйтесь на стратегию группировки по структурным соображениям, о которых говорилось выше. Если ваша игра требует частого обновления контента, сгруппируйте его таким образом, чтобы игроки могли скачать именно то, что им нужно, и тогда, когда это нужно.
Рассмотрите возможность использования меток для идентификации контента из разных пакетов, которые будут нужны вместе во время выполнения, например, набор косметических предметов, который будет расти со временем по мере развития игры. Вы также можете использовать режим группировки "Упаковать вместе по меткам" в настройках групп, чтобы разделить контент, который вы логически сгруппировали вместе.
Например, возможно, вы планируете запустить новое событие "Хэллоуин 2023" с косметическими предметами для игроков. Ваша группа "Наряды на Хэллоуин 2023" может содержать активы с метками "Шляпы", "Обувь" и "Маски". Затем вы можете добавить ярлык "Halloween 2023" ко всем активам в этой группе. Использование режима бандлов "Pack Together By Label" для этой группы создаст три бандла активов во время сборки.
Во время выполнения игры вы можете загрузить все адресуемые активы с меткой "Шляпы" на экране настройки персонажа, чтобы убедиться, что все активы с этой меткой загружены, помещены в память и готовы к просмотру игроками. Или вы можете загрузить все адресуемые активы с ярлыком "Halloween 2023" на промо-страницу вашего мероприятия, чтобы они были готовы к показу игрокам.


Глубокое понимание структуры игры и ее дорожной карты поможет вам принимать взвешенные решения по организации контента, которые будут полезны на протяжении всего жизненного цикла игры.
Далее мы рассмотрим конкретные сильные и слабые стороны ваших платформ и то, что они означают для вашей контент-стратегии.
Следующий фактор, который необходимо учитывать, - это сильные и слабые стороны платформ, на которые вы ориентируетесь для распространения. В этом разделе мы описали распространенные платформы для пользователей Addressables, а также некоторые ключевые моменты для каждой из них.
Мобильные устройства и VR
Для мобильных и VR-платформ наиболее важными факторами, о которых следует помнить, являются размер приложения, размер контента в комплекте и скорость загрузки.
Для своих групп рассмотрите наборы контента, которые понадобятся игрокам сразу после установки (например, чтобы завершить учебник). Убедитесь, что этот контент организован в группы с локальными путями загрузки, чтобы он был включен в вашу базовую игру. Организуйте весь остальной контент в группы с удаленными путями загрузки, чтобы вы могли доставлять его игрокам по воздуху.
Выбирайте групповую стратегию, которая позволит создавать относительно небольшие пучки активов. Точный баланс будет зависеть от вашей игры. Избегайте очень больших пакетов, которые будут занимать значительный объем памяти и которые будет трудно освободить после загрузки. Аналогично, избегайте огромного количества крошечных пакетов, которые могут создать очень большой файл каталога Addressables, загружаемый при каждом обновлении содержимого. Многие крошечные пакеты также могут повлиять на скорость загрузки нужного игрокам контента, поэтому учитывайте все плюсы и минусы при определении правильного баланса для вашей игры.
Настольные компьютеры и консоли
Для настольных компьютеров и консолей самым важным фактором является производительность. По сравнению с мобильными устройствами и беспроводным VR-оборудованием, настольное и консольное оборудование обычно имеет меньше ограничений по объему памяти и дискового пространства. Учитывая это, рассмотрим групповую настройку, которая будет создавать несжатые AssetBundles. Это обеспечит максимально быструю загрузку и может даже обеспечить эффективное обновление на некоторых платформах.
При разработке для консолей внимательно следите за ограничениями на кэширование, которые могут действовать для каждой конкретной платформы. В то время как мобильные платформы позволяют воспользоваться кэшем Unity AssetBundle Cache для загруженного контента, для некоторых консолей и WebGL эта функция отключена по умолчанию на уровне движка Unity. Подумайте о том, чтобы обновить свою базовую игру с помощью нового контента на этих платформах, а не пытаться доставить удаленный контент по воздуху. В противном случае вам придется создать собственную систему кэширования AssetBundle и определить, соответствует ли ваше решение условиям обслуживания этих платформ.
Оценив сильные и слабые стороны целевых платформ, определите одну или две основные цели, которых вы хотите достичь с помощью системы Addressables. Например: Вы в основном стремитесь уменьшить размер базовой игры или планируете поставлять игрокам обновления контента по воздуху? Чтобы продемонстрировать это, давайте подробно рассмотрим эти и другие варианты ниже.
Минимизация размера базовой игры
Если ваша главная цель - минимизировать размер базовой игры, и вас не беспокоит ограничение памяти или большие загрузки после установки, то вам следует сосредоточиться на переносе как можно большего количества активов из сцен и ресурсов в одну или несколько групп Addressables с удаленными путями загрузки.
Подумайте о том, чтобы сделать сцены в вашем проекте адресуемыми, и определите, какие из них, если таковые имеются, должны быть включены в сборку основного проигрывателя. Те сцены, которые могут быть доставлены игрокам после установки, включите в группы с удаленными путями загрузки. Вы даже можете создать игрока с одной почти пустой сценой и динамически загружать оттуда остальную часть игры, как объясняется в этом видео Open Projects Devlog.

Если вы делаете какую-либо сцену адресной, лучше сделать адресными все сцены, чтобы уменьшить вероятность и объем ненужного дублирования активов.
Для групп, которые будут генерировать AssetBundles для удаленного размещения, обязательно включите кэш AssetBundle Cache. Эта настройка обеспечит кэширование загруженных AssetBundles на устройствах игроков, что избавит их от необходимости заново скачивать их каждую сессию.
Хотя всегда полезно помнить о последствиях во время выполнения для многих небольших пакетов по сравнению с несколькими большими, эти соображения становятся более актуальными, если учесть другие цели, которые вы можете преследовать.
Эффективная доставка удаленного контента игрокам
Если ваша главная цель - эффективная доставка удаленного контента, структура группы должна отражать то, как вы собираетесь распределять контент между "локальным" (то есть активами, включенными в сборку плеера) и "удаленным" (то есть активами, размещенными во внешней сети доставки контента). И снова не забудьте включить AssetBundle Cache, чтобы кэшировать загруженный контент на устройствах игроков.
Размер, количество и режим Bundle Mode этих групп будет зависеть от того, когда вы планируете доставить удаленный контент игрокам и как долго вы готовы ждать завершения загрузки. Например, если структура вашей игры позволяет доставлять весь удаленный контент вскоре после установки базовой игры, вы можете выбрать большие группы с помощью Pack Together или Pack Together By Label, что приведет к небольшому количеству больших загрузок.
Если вы планируете предоставлять игрокам небольшие наборы удаленного контента в течение их сеансов, что будет меньше мешать игровому процессу, вы можете выбрать меньшие группы и/или настройку Bundle Mode, которая будет генерировать меньшие AssetBundles, загружающиеся гораздо быстрее.
В большинстве случаев для групп, содержащих удаленное содержимое, используйте опцию Включено, Исключить кэширование для параметра Циклическая проверка избыточности (CRC) AssetBundle. Это обеспечит дополнительные гарантии целостности удаленного контента при его кэшировании на устройствах игроков и позволит избежать дополнительных затрат на выполнение CRC для загрузки контента, уже находящегося на устройствах игроков.
Оптимизация использования памяти во время выполнения и производительности
Если ваша главная цель - оптимизация производительности игры во время выполнения и использования памяти, помните самое важное правило организации групп Addressables: Имущество, которое вы планируете погрузить и разгрузить в одно и то же время, должно быть сгруппировано.
Как правило, это означает создание более мелких AssetBundles. Этого можно добиться несколькими способами, в том числе создавая меньшие группы и/или избегая режима "Собрать вместе" в настройках группы для больших групп, содержащих активы, которые не всегда будут нужны в одно и то же время в вашей игре.
Также необходимо следить за производительностью во время выполнения программы, чтобы выявить потенциальные проблемы или области оптимизации. Воспользуйтесь официальными инструментами Unity, такими как Unity Profiler, пакет Memory Profiler или Addressables Event Viewer, которые помогут оптимизировать производительность вашей игры.
Следите за появлением модуля Addressables Profiler, который заменит Addressables Event Viewer. Этот новый инструмент предоставит еще более подробную информацию о том, как ваш код загружает и выгружает адресуемые активы и AssetBundles, включая подробную информацию о зависимостях между вашими активами и AssetBundles.
Множественные цели
Конечно, большинство проектов будет иметь ряд целей, связанных с Addressables. В этом случае действительно не существует универсального подхода. Вам нужно будет оценить компромиссы, описанные выше, и найти структуру и настройки группы, которые позволят достичь успеха, который вы определили.
Мы рекомендуем вам воспользоваться отчетом Addressables Build Report и модулем Addressables Profiler, которые скоро появятся в версии Addressables 1.21.3. Отчет о сборке Addressables предоставит вам подробную информацию о пучках активов, созданных в результате сборки Addressables, включая размер файлов, возможные дубликаты и подробную информацию о зависимостях. Модуль Addressables Profiler - это новый инструмент анализа времени выполнения, который использует преимущества этих новых данных о зависимостях, предоставляя точную информацию о том, что было загружено вашим кодом Addressables и почему это было загружено.
Ниже мы привели несколько удобных "шпаргалок" для рекомендуемых настроек и стратегий Addressables, основанных на некоторых наиболее распространенных вариантах использования. Разумеется, это всего лишь предложения - вам решать, соответствует ли то или иное предложение уникальной структуре вашего проекта и вашим конкретным целям.
- Мобильная игра с частыми обновлениями контента
- Автономная, самостоятельная настольная или консольная игра
- VR-игра, созданная для Meta Quest 2
Если у вас есть вопросы или вы хотите узнать больше о пакете Addressables, заходите к нам на форум Addressables. Вы также можете связаться со мной напрямую в Twitter по адресу @Unity_Jeff. Следите за новыми техническими блогами от других разработчиков Unity в рамках продолжающейсясерииTech from theTrenches.