Найти в Дзене

Addressables: Планирование и лучшие практики(перевод)

Оглавление

Оригинал(Все ссылки и оригинальное оформление сохранены)

Изображение для привлечения внимания
Изображение для привлечения внимания

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

Unity предоставляет полный конвейер, который помогает разработчикам и издателям добиться успеха на сегодняшнем игровом рынке. Этот конвейер начинается и заканчивается с Addressables, пакетом Unity, который был выпущен в 2019 году и теперь приводит к успеху тысячи живых игр и десятки тысяч больше в разработке.

Пакет Addressables предоставляет пользовательский интерфейс (UI) и API для организации Unity-ассетов для создания AssetBundles и их динамической загрузки и выгрузки во время выполнения. Независимо от того, отправляются ли AssetBundles вместе с вашей базовой игрой или хостятся и доставляются из удаленной сети доставки контента (CDN), такой как Cloud Content Delivery, Addressables помогает вам загружать нужные ассеты только тогда, когда они вам нужны.

Хотя система Addressables может упростить многие аспекты управления контентом, это не является функцией "установи и забудь". Выбор, который вы сделаете в отношении того, как организовать, создавать, загружать и выгружать адресуемые ассеты, имеет существенные последствия для размера и производительности вашей игры.

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

Конечно, лучшая стратегия будет зависеть от игры, которую вы создаете, и ваших целей. Используйте этот гид как справочник вместе с материалами Unity Learn, документацией Unity Manual и сообществом на форуме Addressables, созданным сообществом.

AssetBundles

В центре Addressables находится инструмент для создания и работы с AssetBundles. Прежде чем приступать к изучению пользовательского интерфейса и API Addressables, важно понимать формат файлов-архивов AssetBundles и некоторые последствия во время выполнения.

Вы можете думать об AssetBundles как о контейнерах - это файлы-архивы, созданные для целевых платформ, которые могут содержать ресурсы, такие как модели, текстуры, префабы, ScriptableObjects, аудио клипы и даже целые сцены, которые Unity может загружать во время выполнения.

Одной из ключевых особенностей AssetBundles является то, что они могут выражать зависимости друг от друга. Например, AssetBundle 1 может содержать префаб, который зависит от текстуры в AssetBundle 2. Когда вы используете Addressables для загрузки префаба во время выполнения, система Addressables автоматически загрузит AssetBundle 2 и зависимую текстуру в память. И если в AssetBundle 1 есть еще один ресурс, который зависит от ресурса в AssetBundle 3, AssetBundle 3 также будет загружен в память, и так далее.

Диаграмма AssetBundle 1 и его зависимостей от AssetBundle 2 и 3 из примера в предыдущем абзаце.
Диаграмма AssetBundle 1 и его зависимостей от AssetBundle 2 и 3 из примера в предыдущем абзаце.

Когда ваша игра запущена, система Addressables отслеживает активные ссылки на все ассеты, включая зависимые ассеты, как, например, текстуру, о которой мы говорили выше, чтобы определить, какие из них должны быть в памяти. Ассет, загруженный из AssetBundle, не может быть удален из памяти до тех пор, пока его счетчик ссылок и все другие счетчики ссылок на ассеты в том же AssetBundle не будут равны 0. Сам AssetBundle может быть удален из памяти только тогда, когда все счетчики ссылок на ассеты в AssetBundle будут равны 0.

С учетом этой тесной связи между Addressables и AssetBundles, самое важное правило при организации вашего содержимого Addressables - это создание AssetBundles, которые содержат дискретные наборы ассетов, которые вы ожидаете будут загружены и выгружены вместе.

Группы и стратегии проектирования Addressables

Наиболее важным решением при использовании Addressables является способ организации ваших ресурсов в группы Addressables. Рассмотрим несколько вопросов, которые следует учитывать:

Следует ли создавать много маленьких групп или меньшее количество больших групп? Для каждой группы, сколько AssetBundles следует генерировать (т.е. следует ли упаковывать ресурсы в этой группе вместе, отдельно или по метке)? Следует ли использовать метки? Следует ли использовать локальные или удаленные пути загрузки для ваших групп? Хотя мы хотели бы дать один ответ, лучшая стратегия группировки Addressables будет зависеть от нескольких факторов, конкретных для вашей игры.

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

Прежде чем начать организацию ваших адресуемых ресурсов, убедитесь, что вы хорошо понимаете следующее:

  1. Структуру и дорожную карту вашей игры
  2. Сильные и слабые стороны платформы вашей игры
  3. Ваши основные цели при использовании Addressables для оптимизации производительности вашей игры

Мы рассмотрим каждый из этих факторов ниже.

Структура и дорожная карта игры

Первый фактор, который нужно учесть, это структура и дорожная карта вашей игры.

Под "структурой" мы понимаем фактическую архитектуру вашей игры. Является ли ваша игра линейным путешествием одного игрока, где игрок будет продвигаться через предсказуемый набор уровней или среды? Является ли она многоплатформенной PvP-игрой с тысячами предметов для настройки, которые могут быть созданы в непредсказуемые моменты? Структура вашей игры будет определять, когда вам нужно будет загрузить активы и AssetBundles в память, и когда вы сможете выгрузить активы и AssetBundles из памяти.

Не забывайте создавать AssetBundles, которые содержат только активы, которые нужно загружать вместе и выгружать вместе. Если ваша игра представляет собой линейное путешествие с четкими точками остановки, рассмотрите возможность организации групп Addressables в более крупные подмножества контента, связанные с каждым разделом вашей игры. Таким образом, эти активы могут быть загружены и выгружены вместе.

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

"Roadmap" относится к тому, как ваша игра будет развиваться со временем. После того, как ваша игра выйдет в мир, она будет оставаться практически неизменной, за исключением случайных исправлений ошибок или изменения баланса игры? Или вы планируете регулярно добавлять новый контент, не требуя от игроков установки большого обновления клиента?

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

Рассмотрите возможность использования меток для идентификации контента из отдельных пакетов, которые будут нужны во время выполнения, например, набора косметических предметов, которые будут расширяться с течением времени по мере развития вашей игры. Вы также можете использовать режим «Упаковать вместе по метке» в настройках групп для разделения контента, который вы логически сгруппировали вместе.

Например, предположим, что вы планируете запустить новое событие "Хэллоуин 2023" с некоторыми косметическими предметами, которые игроки могут собрать. Ваша группа "Костюмы Хэллоуина 2023" может содержать ресурсы с метками "Шляпы", "Обувь" и "Маски". Затем вы можете добавить метку "Хэллоуин 2023" ко всем ресурсам в этой группе. Использование режима "Упаковать вместе по метке" в настройках этой группы создаст три AssetBundle во время сборки.

Во время выполнения, вы можете загрузить все адресные ресурсы с меткой "Шляпы" на экране настройки персонажа, чтобы убедиться, что все ресурсы с этой меткой загружены, загружены в память и готовы к просмотру игроками. Или вы можете загрузить все адресные ресурсы с меткой "Хэллоуин 2023" на вашей промо-странице для вашего события, гарантируя, что они будут готовы к отображению для ваших игроков.

Имея глубокое понимание структуры и плана развития вашей игры, вы сможете принимать обоснованные решения относительно организации контента, что будет полезно на протяжении всего жизненного цикла игры.

Далее мы рассмотрим конкретные преимущества и ограничения ваших платформ и то, что это означает для вашей стратегии контента.

Сильные и слабые стороны платформ

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

Мобильные и VR-платформы

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

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

Выберите стратегию группировки, которая будет создавать относительно небольшие AssetBundles. Точный баланс будет зависеть от вашей игры. Избегайте крайне больших пакетов, которые будут занимать значительное количество памяти и будут сложно выгружаться после загрузки. Аналогично, избегайте огромного количества крошечных пакетов, которые могут создать очень большой файл каталога Addressables, который будет загружаться для каждого обновления контента. Множество крошечных пакетов также может повлиять на скорость, с которой ваши игроки смогут загружать нужный контент, поэтому будьте внимательны при определении правильного баланса для вашей игры.

ПК и консоли

На пк и консолях наиболее важным является производительность. По сравнению с мобильными устройствами и беспроводными VR-устройствами, у компьютеров и консолей обычно меньше ограничений на память и дисковое хранилище. Исходя из этого, рассмотрите настройку групп, которая будет строить не сжатые AssetBundles. Это обеспечит максимально быстрое время загрузки и даже может обеспечить эффективное обновление на некоторых платформах.

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

Определение основных целей

После оценки преимуществ и ограничений целевых платформ, определите одну или две основные цели, которые вы хотите достичь, используя систему Addressables. Например: вы стремитесь в основном уменьшить размер вашей базовой игры, или вы планируете доставлять обновления контента по воздуху игрокам? Для демонстрации рассмотрим эти и другие варианты детальнее ниже.

Минимизация размера базовой игры

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

Рассмотрите возможность сделать сцены в вашем проекте addressable и определите, какие из них необходимы в основной сборке игрока. Для тех, которые могут быть доставлены игрокам после установки, включите эти сцены в группы с удаленными путями загрузки. Вы можете даже создать игрока с одной почти пустой сценой и загружать остальную часть вашей игры динамически оттуда, как объясняется в этом Devlog от Open Projects.

Диаграмма содержимого сборки из проекта, в котором только сцена «Initialization» включена в основную игру, две основные игровые сцены «Beach» и «Forest» упакованы в AssetBundles для загрузки по мере необходимости, три другие сцены («Persistent Managers», «Gameplay» и «Main Menu») упакованы в свои собственные AssetBundles, и еще один AssetBundle содержит ScriptableObjects, которые будут нужны в нескольких сценах.
Диаграмма содержимого сборки из проекта, в котором только сцена «Initialization» включена в основную игру, две основные игровые сцены «Beach» и «Forest» упакованы в AssetBundles для загрузки по мере необходимости, три другие сцены («Persistent Managers», «Gameplay» и «Main Menu») упакованы в свои собственные AssetBundles, и еще один AssetBundle содержит ScriptableObjects, которые будут нужны в нескольких сценах.

Если вы делаете какие-либо сцены доступными через Addressables, лучше сделать все сцены доступными, чтобы уменьшить вероятность и объем ненужного дублирования ресурсов.

Для групп, которые будут генерировать AssetBundle для удаленного хостинга, убедитесь, что включен AssetBundle Cache. Эта настройка обеспечит кэширование загруженных AssetBundle на устройствах ваших игроков, предотвращая повторную загрузку в каждой сессии.

Хотя всегда хорошо иметь в виду последствия времени выполнения множества маленьких бандлов против нескольких больших, эти соображения становятся более актуальными, когда рассматриваются другие цели, которые вы можете иметь.

Эффективная доставка удаленного контента до пользователя

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

Размер, количество и режим упаковки (Bundle Mode) этих групп будут зависеть от того, когда вы планируете доставлять удаленный контент игрокам и насколько долго вы готовы ждать завершения загрузок. Например, если структура вашей игры позволит доставить всю удаленную контент непосредственно после установки базовой игры, вы можете выбрать большие группы с опцией Pack Together или Pack Together By Label, что приведет к небольшому количеству больших загрузок.

Если вы планируете доставлять небольшие наборы удаленного контента игрокам на протяжении их сессий, что будет меньше мешать им в процессе, вы можете выбрать меньшие группы и/или настройку Bundle Mode, которая будет генерировать меньшие AssetBundles, которые будут загружаться гораздо быстрее.

В большинстве случаев для групп, содержащих удаленный контент, рекомендуется выбирать вариант Enabled, Excluding Cached для вашей опции AssetBundle Cyclic Redundancy Check (CRC). Это обеспечит дополнительные гарантии целостности удаленного контента при кэшировании его на устройствах игроков, избегая дополнительных накладных расходов на выполнение CRC для загрузки контента, который уже есть на устройствах игроков.

Оптимизация использования памяти и производительности во время выполнения игры

Если ваша основная цель - оптимизация производительности и использования памяти во время выполнения игры, помните об основном правиле организации групп в Addressables: активы, которые вы планируете загружать и выгружать одновременно, должны быть сгруппированы вместе.

В целом, это означает создание более мелких AssetBundles. Это можно сделать несколькими способами, включая создание более мелких групп и/или избегание режима "Pack Together" в Bundle Mode для больших групп, которые содержат активы, которые не всегда нужны одновременно в вашей игре.

Вы также должны следить за производительностью во время выполнения, чтобы выявлять потенциальные проблемы или области оптимизации. Используйте официальные инструменты Unity, такие как Unity Profiler, пакет Memory Profiler или Addressables Event Viewer, которые помогут оптимизировать производительность вашей игры.

Будьте внимательны к предстоящему Addressables Profiler Module, который заменит Addressables Event Viewer. Этот новый инструмент предоставит еще более подробную информацию о том, как ваш код загружает и выгружает адресуемые ресурсы и AssetBundles, включая подробную информацию о зависимостях между вашими ресурсами и AssetBundles.

Множество целей

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

Мы рекомендуем воспользоваться Addressables Build Report и Addressables Profiler Module, которые скоро будут доступны в Addressables 1.21.3. Addressables Build Report предоставит вам подробную информацию о AssetBundles, которые были сгенерированы в вашей сборке Addressables, включая размер файлов, возможные дубликаты и подробную информацию о зависимостях. Addressables Profiler Module является новым инструментом анализа времени выполнения, который использует эту новую информацию о зависимостях, предоставляя точную информацию о том, что было загружено вашим кодом Addressables и почему оно было загружено.

Шпаргалки: распространенные варианты использования

Ниже мы предоставляем удобные "шпаргалки" для наших рекомендуемых настроек и стратегий Addressables на основе некоторых наиболее распространенных случаев использования. Конечно, это только предложения - вам нужно определить, соответствует ли предложение уникальной структуре вашего проекта и ваших конкретных целей.

Если у вас есть вопросы или вы хотите узнать больше о пакете Addressables, посетите нас на форуме Addressables. Вы также можете связаться со мной напрямую в Twitter по адресу @Unity_Jeff. Обязательно следите за новыми техническими блогами от других разработчиков Unity в рамках серии Tech from the Trenches.