Content directories: Beyond the AssetBundle

Sep 22, 2026|6 Min
George Ing
George Ing - Unity Technologies
Senior Engineering Manager
Content directories in Unity 6.6

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

Сегодня немного о контенте в Unity .

Начиная с Unity 2.1, скромный AssetBundle лежит в основе контента Unity , распространяемого вне исполняемого файла Player. За последние двадцать лет невероятное количество игр использовали AssetBundles в качестве представления данных, включая некоторые из крупнейших проектов в мире.

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

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

Сегодня мы поговорим о чём-то новом для среды выполнения Unity .

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

Каталоги контента представляют собой фундаментальную, более производительную и более детализированную замену AssetBundles. Сегодня они доступны в Unity 6.6 в качестве альтернативы AssetBundles, поставляемым вместе с плеером. В эпоху Unity 7 технологический стек расширится, чтобы обеспечить полноценную, детализированную доставку обновлений по беспроводной сети (подробнее об этом позже — это очень круто).

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

Диаграмма, показывающая, как ресурсы Unity загружаются из локального хранилища в оперативную память. Слева находится панель «Локальное хранилище», содержащая девять значков ресурсов Unity (3D модели, атласы спрайтов, аудиоклипы и префабы). Стрелка с надписью «Загружать по отдельности» указывает вправо на панель «Рабочая память», содержащую только три из этих ресурсов, а ниже находится пустое пространство с надписью «Доступно для другой работы». Под стрелкой расположен подзаголовок: «Зарядка → использование → выпуск».

Управление контентом в проектах Unity стало проще, чем когда-либо, благодаря ускоренной сборке и уменьшению проблем с размещением ресурсов и структурой AssetBundle.

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

Как нам это удалось? Давайте заглянем под капот каждого этапа конвейера.

Знакомая основа: Строить

Еще в 2019 году мы обсуждали, чего бы нам хотелось от серьезной системы сборки в Unity : параллельной сборки на каждом ядре, детерминированной, полностью кэшированной и способной обмениваться данными сборки между машинами. Оказалось, что некоторые из наших коллег уже много лет поставляли API именно с такими свойствами — фреймворк для импорта ресурсов.

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

Возможно, вы уже слышали об этой системе сборки. Некоторые из вас, возможно, помнят многопроцессный конвейер сборки, который мы анонсировали в Unity 2023.1. Это тот же самый фундамент.

Диаграмма, показывающая, как исходные файлы преобразуются в ресурсы Unity с помощью импортера сборки. Два файла FBX создают по два объекта AssetBundle (обозначены синими и серыми значками пакетов), а два файла PNG создают по одному спрайту/текстуре (обозначены квадратными значками в виде шахматной доски). Стрелки, указывающие на разветвление файлов FBX, показывают, что один исходный 3D файл может генерировать множество ресурсов для выполнения программы.

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

Это невероятно просто.

Знакомая основа: Адресация

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

c0152db4dd710be51b2decb997325f34.cf
f0a44ad4a4babd121543fd44032928e7.resS
4226b5c16a50dab6eff0f08dd1253d4b.resource

А вот что интересно — это не случайный хеш. Вместо этого система каталогов контента использует ту же схему хранения данных с адресацией по содержимому, что и такие технологии, как Git. Каждый файл с содержимым именуется и на него ссылается хеш его содержимого. Этот шаблон невероятно полезен для среды выполнения Unity , поскольку позволяет ей неявно удалять дубликаты контента в качестве встроенной функции.

Тем не менее, хранилище с адресацией по содержимому и истинным графом зависимостей сопряжено с риском высокой текучести кадров. Рассмотрим простейшее возможное соотношение между двумя артефактами:

A → B

Обновите B, и хеш B изменится. К сожалению, поскольку A ссылается на B, хеш A также изменяется. Хуже того, это распространяется по всей цепочке.

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

Таким образом, среда выполнения получает все необходимое для загрузки!

Знакомая основа: Нагрузка

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

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

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

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

Диаграмма, сравнивающая два конвейера загрузки ресурсов Unity . В верхней части, обозначенной как "AssetBundles", показан сериализованный файл, обрабатываемый последовательно: каждый ресурс проходит этапы чтения и десериализации по очереди, после чего следует заключительный этап активации, а загрузка данных на графический процессор происходит только в конце. Это обозначено как «Последовательный». В нижней части, озаглавленной «Каталоги контента», показан файл контента, обработанный с использованием конвейера, основанного на выполнении заданий: сначала все ресурсы считываются параллельно, затем этапы десериализации и активации каждого ресурса выполняются поэтапно и с наложением, при этом загрузка данных на графический процессор распределяется по всему файлу. Этот пример помечен как "Jobified", что демонстрирует преимущество параллельной загрузки по сравнению с последовательным подходом AssetBundle с точки зрения производительности.

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

Загружаемая<сетка> модель тела;
bodyMesh.Load();

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

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

Создавать масштабируемые игры в Unity стало проще, чем когда-либо!

Проверка работоспособности каталогов контента: Slime Rancher 2

В течение последних нескольких месяцев несколько наших партнеров любезно разрешили нам протестировать каталоги контента в своих играх.

В качестве примера рассмотрим отличную игру Slime Rancher 2 от Monomi Park и некоторые преимущества, которые она получает от перехода на каталоги контента. (Slime Rancher доступна в Steam!) Slime Rancher , Slime Rancher 2 )

Поэтапное время сборки:
Addressables (Бэкенд AssetBundle)
32 минуты 16 секунд;
Addressables (бэкэнд каталога контента)
3 минуты 4 секунды.
Время сборки без очистки:
Addressables (Бэкенд AssetBundle)
58 ​​минут, 6 секунд;
Addressables (бэкэнд каталога контента)
37 минут, 13 секунд.
Размер сборки плеера:
Addressables (Бэкенд AssetBundle)
4 ГБ
Addressables (бэкэнд каталога контента)
/ 2,88 ГБ
Время загрузки (Запуск игры -> Меню -> Игровой процесс)
Addressables (Бэкенд AssetBundle)
45 секунд
Addressables (бэкэнд каталога контента)
30 секунд

Эти данные основаны на версии редактора Unity 6.6 Beta (6000.6.0b10) , запущенной на MacBook Pro (M5 Max).

Самое приятное то, что преимущества новой системы загрузки сразу же видны пользователям. Ещё круче то, что Slime Rancher 2 — это уже существующий проект Addressables , который перешёл на использование каталогов контента без каких-либо изменений в коде.

Честно говоря, нам не терпится увидеть, какие преимущества получат игры в экосистеме Unity с выходом каталогов контента в версии 6.6. Но это оставляет открытым вопрос: а как насчет удаленного контента?

Что дальше: удаленная доставка контента

Те из вас, кто присутствовал на презентации Unite Seoul Roadmap в этом году, возможно, помнят, как Джейсон Манн намекнул, что наша новая основа для каталогов контента значительно упростит удаленную доставку контента в предстоящем поколении Unity 7. Давайте кратко обсудим, что это на самом деле означает и как это связано с тем, что мы уже рассмотрели.

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

Ответ однозначно отрицательный.

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

Благодаря современным стандартам HTTP, Unity теперь может мультиплексировать большие объемы запросов к ресурсам.

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

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

Более подробную информацию об этом проекте мы предоставим в 2027 году.

Попробуйте использовать каталоги контента в Unity 6.6 уже сегодня!

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

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

Еще раз спасибо нашим друзьям из Monomi Park за помощь в демонстрации каталогов контента с их потрясающим заголовком! ( Slime Rancher , Slime Rancher 2 ).