Content directories: Beyond the AssetBundle
George Ing - Unity Technologies
Senior Engineering Manager
Эта веб-страница была переведена с помощью машинного перевода для вашего удобства. Мы не можем гарантировать точность или надежность переведенного контента. Если у вас есть вопросы о точности переведенного контента, обращайтесь к официальной английской версии веб-страницы.
Сегодня немного о контенте в Unity .
Начиная с Unity 2.1, скромный AssetBundle лежит в основе контента Unity , распространяемого вне исполняемого файла Player. За последние двадцать лет невероятное количество игр использовали AssetBundles в качестве представления данных, включая некоторые из крупнейших проектов в мире.
На базовом уровне каждый AssetBundle представляет собой неделимую единицу для распределения, хранения и погрузки. AssetBundles отслеживают свои зависимости на уровне пакета, образуя более крупную монолитную единицу, которую для повышения эффективности необходимо загружать, выгружать и удалять одновременно.
В силу этой спецификации, то, как игра определяет структуру своего AssetBundle, является важнейшим фактором во всем, от производительности во время выполнения до размера загружаемого файла. Это справедливо как при использовании AssetBundles напрямую, так и через пакет Addressables .
Сегодня мы поговорим о чём-то новом для среды выполнения Unity .
Представляем каталоги контента.
Каталоги контента представляют собой фундаментальную, более производительную и более детализированную замену AssetBundles. Сегодня они доступны в Unity 6.6 в качестве альтернативы AssetBundles, поставляемым вместе с плеером. В эпоху Unity 7 технологический стек расширится, чтобы обеспечить полноценную, детализированную доставку обновлений по беспроводной сети (подробнее об этом позже — это очень круто).
Вместо того чтобы объединять ресурсы в большие загружаемые модули, каталоги контента предоставляют среде выполнения Unity возможность независимо идентифицировать, загружать и выгружать отдельные артефакты.(сетки, текстуры и т. д.) с полным использованием аппаратных ресурсов и неявной дедупликацией контента.

Управление контентом в проектах Unity стало проще, чем когда-либо, благодаря ускоренной сборке и уменьшению проблем с размещением ресурсов и структурой AssetBundle.
Создаваемые вами игры становятся меньше по размеру, работают быстрее, обеспечивают неявную дедупликацию данных и получают доступ к полному динамическому управлению памятью через новый загружаемый ссылочный тип. Для пользователей, использующих Addressables для контента, поставляемого в комплекте с плеером, можно переключиться на каталоги контента с помощьюИзменения, не требующие написания кода.
Как нам это удалось? Давайте заглянем под капот каждого этапа конвейера.
Знакомая основа: Строить
Еще в 2019 году мы обсуждали, чего бы нам хотелось от серьезной системы сборки в Unity : параллельной сборки на каждом ядре, детерминированной, полностью кэшированной и способной обмениваться данными сборки между машинами. Оказалось, что некоторые из наших коллег уже много лет поставляли API именно с такими свойствами — фреймворк для импорта ресурсов.
Таким образом, процесс создания каталога контента выполняется в рамках стандартной структуры импорта ресурсов. Каждый ресурс создается индивидуально с помощью импортера ресурсов, в изолированной среде и вне основного процесса. Процесс сборки является детерминированным, включает кэширование в базе данных ресурсов, полную загрузку всех аппаратных ядер и встроенную поддержку ускорителей для быстрой сборки общих файлов.
Возможно, вы уже слышали об этой системе сборки. Некоторые из вас, возможно, помнят многопроцессный конвейер сборки, который мы анонсировали в Unity 2023.1. Это тот же самый фундамент.

В результате получается набор детализированных артефактов, небольшой манифест, отслеживающий зависимости между ними, и новый набор диагностических файлов, которые упрощают понимание процесса сборки.
Это невероятно просто.
Знакомая основа: Адресация
Если вы откроете каталог сборки с содержимым и посмотрите на артефакты, вы заметите, что у каждого артефакта довольно странное хешированное имя:
c0152db4dd710be51b2decb997325f34.cff0a44ad4a4babd121543fd44032928e7.resS4226b5c16a50dab6eff0f08dd1253d4b.resource
А вот что интересно — это не случайный хеш. Вместо этого система каталогов контента использует ту же схему хранения данных с адресацией по содержимому, что и такие технологии, как Git. Каждый файл с содержимым именуется и на него ссылается хеш его содержимого. Этот шаблон невероятно полезен для среды выполнения Unity , поскольку позволяет ей неявно удалять дубликаты контента в качестве встроенной функции.
Тем не менее, хранилище с адресацией по содержимому и истинным графом зависимостей сопряжено с риском высокой текучести кадров. Рассмотрим простейшее возможное соотношение между двумя артефактами:
A → B
Обновите B, и хеш B изменится. К сожалению, поскольку A ссылается на B, хеш A также изменяется. Хуже того, это распространяется по всей цепочке.
Вместо этого артефакты ссылаются друг на друга не по хешу содержимого, а по стабильному идентификатору. В манифесте сборки хранится небольшая справочная таблица, сопоставляющая стабильные идентификаторы с хэшами контента.
Таким образом, среда выполнения получает все необходимое для загрузки!
Знакомая основа: Нагрузка
В каталогах контента мы внедряем невероятно производительную систему динамической загрузки.
При монтировании каталога с контентом система загрузки считывает манифест и разрешает зависимости стабильных идентификаторов между артефактами. Это позволяет загружать и выгружать каждый артефакт совершенно независимо, исключая загрязнение от находящихся рядом артефактов. (Помните проблему с AssetBundles — одна монолитная, неделимая единица?) Ушел.)
Пользователям DOTS базовый формат файлов артефактов также может показаться довольно знакомым. Каталоги контента создают и загружают следующее поколение формата файлов контента, который мы представили в DOTS в 2022 году, внедряя технологию, которая обеспечивала многопоточную загрузку Entities в течение четырех лет, во все ресурсы.
Это система загрузки, полностью асинхронная как для операций чтения, так и для десериализации. Это означает более высокую пропускную способность для загрузки данных и использование специфических для платформы асинхронных API для чтения.

Что еще более интересно, основа каталога контента позволяет нам впервые внедрить в Unity современный загружаемый ссылочный тип, называемый Loadable .
Загружаемая<сетка> модель тела;bodyMesh.Load();
Это действительно загружаемая ссылка, встроенная непосредственно в движок для проектов, основанных на каталогах контента. Объекты, на которые ссылаются загружаемые объекты, будут включены в сборку, но не будут загружены до тех пор, пока вы не вызовете загружаемый объект. Сочетание загружаемых объектов с (очень) знакомым интерфейсом ScriptableObject позволяет невероятно быстро организовывать динамически загружаемый контент.
Этот принцип нас очень вдохновляет. Используя каталоги контента и загружаемые элементы в качестве основы, любойобъектВ Unity можно создавать как независимо загружаемые, так и выгружаемые модули — эта возможность встроена непосредственно в движок — от элементов редактора персонажей до фрагментов потокового ландшафта, без необходимости проектирования с использованием AssetBundle или определений групп.
Создавать масштабируемые игры в Unity стало проще, чем когда-либо!
Проверка работоспособности каталогов контента: Slime Rancher 2
В течение последних нескольких месяцев несколько наших партнеров любезно разрешили нам протестировать каталоги контента в своих играх.
В качестве примера рассмотрим отличную игру Slime Rancher 2 от Monomi Park и некоторые преимущества, которые она получает от перехода на каталоги контента. (Slime Rancher доступна в Steam!) Slime Rancher , Slime Rancher 2 )
Эти данные основаны на версии редактора 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 ).