DrakkenRidge: Building an open-world adventure for mobile VR
Simeon Acker and Cyril Guichard - Garage Collective
GUEST BLOG
Made with Unity, DrakkenRidge — это ролевая игра в жанре экшен с открытым миром от Garage Collective, разработанная и оптимизированная для мобильной виртуальной реальности. В этом гостевом блоге команда рассказывает о том, как они используют различные методы проектирования и повышения производительности, применяя систему компонентов сущностей Unity в качестве основы для рендеринга.

Представляем DrakkenRidge VR
Мы — Garage Collective, команда, создавшая DrakkenRidge , ролевую игру с открытым миром, разработанную для VR, где вы можете посетить любую точку, которую увидите на горизонте. Возьмите на себя роль могущественного Охотника на магов и исследуйте шесть прекрасно созданных вручную островов — каждый из которых совершенно уникален, со своими персонажами, заданиями, подземельями и секретами.
Это путешествие проведет вас от теплых уютных пляжей до захватывающих дух заснеженных вершин; от пышных мистических лесов до опасных пропастей глубоко под землей. Создавайте новые предметы, сражайтесь с десятками искусно созданных существ и врагов и открывайте новые школы магии, которые могут превратить каждую встречу в уникальное приключение.
Создание игры такого масштаба командой из двух человек, вероятно, было бы невозможно без системы компонентов сущностей . В этом посте мы расскажем, как использовали эти инструменты для создания нашей масштабной приключенческой игры.
Сочетание различных техник для более плавной разработки игр.
Использование ECS для разработки игр имеет ряд огромных преимуществ, но, будучи небольшой независимой студией, нам пришлось учитывать и другие факторы при проектировании и разработке DrakkenRidge для мобильной VR.
При использовании ECS возникают две основные проблемы:
- Крутая кривая обучения: Разработка с использованием ECS требует полного изменения парадигмы, отказа от типичной объектно-ориентированной логики.
- Разделение систем сущностей и традиционных систем игровых объектов может создавать сложности в их взаимодействии друг с другом.
Таким образом, перед нами встал вопрос:
Какие объекты и взаимодействия должны использовать возможности ECS, а какие должны оставаться традиционными GameObjects и MonoBehaviours?
Entities в Драккен-Ридж
DrakkenRidge представляет собой огромные открытые пространства, в которых находятся десятки тысяч объектов — потенциально тысячи из них могут быть видны игроку в любой момент времени.
Отображение этих объектов в виде традиционных GameObjects требует значительных затрат памяти, поскольку движку необходимо оценить всю иерархию сцены и вычислить компоненты преобразования для каждого объекта. При отрисовке тысяч объектов, особенно на мобильных устройствах, производительность графического процессора заметно снижается.
А что, если мы возьмём эти объекты и представим их как Entities ?

Будучи Entities типа Entities, они избегают большей части накладных расходов на отрисовку и память, связанных с GameObjects , и вместо этого объединяются в блоки памяти с помощью Entities Graphics.система.
Кроме того, в графическом конвейере DrakkenRidge активно используется технология атласирования текстур, что позволяет создавать масштабные окружения с меньшим количеством материалов в целом (подробнее об атласировании текстур см. в нашей статье в блоге здесь ).
Entities Graphics может группировать и обрабатывать все объекты, имеющие общую сетку и материал, после чего движок может создавать плотно упакованные вызовы отрисовки и отображать множество объектов одновременно.
В результате этого можно сэкономить сотни пакетов данных и вызовов SetPass.

Отображение тысяч объектов — всего с помощью восьми вызовов SetPass.
Пользовательские системы сущностей
DrakkenRidge использует ECS для одновременной отрисовки тысяч объектов. Но даже с учетом значительного повышения производительности, которое это обеспечивает, мы все еще можем сделать больше для улучшения пользовательского опыта на мобильных VR-платформах.
система дистанционного создания контента
Первой функцией, которую мы разработали для наших Entities DrakkenRidge , стала система создания изображений с учетом расстояния. При определении момента, когда объект должен быть скрыт или виден игроку, учитывается множество переменных.
Поскольку обзор игрока в открытом мире простирается на очень большое расстояние, в поле зрения могут одновременно находиться тысячи удаленных объектов. Эта система определяет, какие из них должны оставаться на виду, а какие должны отходить на второй план. Эффекты окружающей среды, такие как туман на расстоянии, используются для того, чтобы скрыть переход, когда удаленные объекты исчезают из поля зрения.

Компонент Distance Authoring с настраиваемыми значениями для отсечения сущностей во время выполнения.
В редакторе для каждой сущности генерируются уникальные значения отсечения на основе различных параметров. Затем эти данные передаются в системы во время создания сущности .которые используют эти предварительно рассчитанные данные для принятия решений во время выполнения о том, когда следует отображать или удалять Entities .
Пользовательские группы сущностей
Используя систему дистанционного проектирования DrakkenRidge , Entities можно объединять в группы с возможностью совместного принятия решений, что позволяет, например, быстро отображать или отсекать часть города на основе различных внутриигровых факторов, вместо того чтобы каждый объект в городе принимал решение индивидуально.

Сгруппированные Entities с совместным принятием решений
Уровни детализации сущностей
Третья функция системы создания расстояний DrakkenRidge позволяет мгновенно заменять объекты другими, рендеринг которых обойдется еще дешевле. Этот метод изначально был разработан для решения проблемы использования более дорогих шейдеров и материалов.
Хотя модели окружения в DrakkenRidge и так хорошо оптимизированы, некоторые шейдеры заметно увеличивают затраты ресурсов. Эта система уровней детализации ( LOD ) сущностей позволяет отображать «версии сущностей с более дорогими шейдерами» только при необходимости.
/// If using a simplified LOD object, see if we are in its range
if (inDistanceReturn.useLOD)
{
if (inDistanceReturn.isInDistanceLOD)
{
ecbParallel.SetEnabled(unfilteredChunkIndex, inDistanceReturn.lodEntity, true);
if (ChildLookup.TryGetBuffer(inDistanceReturn.lodEntity, out lodChildBufferData))
{
var newParent = inDistanceReturn.lodEntity;
SetEnableChildren(
entityCanBeReEnabledComponentLookup: entityCanBeReEnabledComponentLookup,
unfilteredChunkIndex: unfilteredChunkIndex,
parentEntity: newParent,
enabled: true,
childBufferData: lodChildBufferData,
ChildLookup: ChildLookup,
ecbParallel: ecbParallel);
}При соблюдении условий используйте упрощенный LOD) для объекта.
Оптимизация ЦП
В DrakkenRidge вычисления расстояний выполняются с помощью задач, скомпилированных в пакетном режиме, для обеспечения максимальной производительности процессора.
Unity Jobs — это функции, которые можно запланировать как асинхронные задачи для выполнения в фоновом режиме, а также Burst Compiler.Ускоряет ресурсоемкие задачи, преобразуя их в высокооптимизированный машинный код.
[BurstCompile]
public partial struct ProcessBufferJob : IJobChunk
{
internal EntityCommandBuffer.ParallelWriter ecbParallel;
public EntityTypeHandle entityTypeHandle;
[ReadOnly] public BufferTypeHandle<Child> childTypeHandle;
[ReadOnly] public ComponentTypeHandle<DistanceCompData> distanceCompDataTypeHandle;
// A BufferLookup for random access to Child buffers.
[ReadOnly] public BufferLookup<Child> childLookup;
[ReadOnly] public ComponentLookup<Disabled> disabledComponentLookup;
public PlayerDesignatorCompData targetDesignator;
public HelperStructToUpdateEnabledEntities addToBufferStruct;
public Entity playerEnt;
public void Execute(in ArchetypeChunk chunk, int unfilteredChunkIndex, bool useEnabledMask, in v128 chunkEnabledMask)
{
var entities = chunk.GetNativeArray(entityTypeHandle);
var childAccessor = chunk.GetBufferAccessor(ref childTypeHandle);
var distanceCompData = chunk.GetNativeArray(ref distanceCompDataTypeHandle);
bool hasChildBuffer = chunk.Has(ref childTypeHandle);
DynamicBuffer<Child> lodChildBufferData;
for (int i = 0; i < chunk.Count; i++)
{
Entity currentEntity = entities[i];Кончик: Одна из оптимизаций для DynamicBuffer заключается в преобразовании его в NativeArray перед итерацией: “var lodChildNativeArray = lodChildBufferData.AsNativeArray();”
GameObjects и физика в DrakkenRidge
В DrakkenRidge 90% игрового мира отрисовывается с помощью ECS, которая выполняет собственные задачи в фоновом режиме, поддерживая видимое окружение в красивом и оптимизированном состоянии.
Но поскольку наша небольшая команда разработчиков, состоящая из одного программиста и одного художника, приняла решение создавать многие из наших интерактивных элементов VR крупным планом, используя традиционные GameObjects и MonoBehaviors. Это позволило сократить время итераций в условиях быстрого тестирования и частых циклов проектирования.
Взаимодействие физических явлений и боевые действия
Взаимодействие в виртуальной реальности в DrakkenRidge в значительной степени основано на физических симуляциях. Это включает в себя всё: от захвата и манипулирования предметами до лазания и паркура, а также использования заклинаний и ближнего боя.
Игроки могут взаимодействовать с основанными на физике задачами по скалолазанию.
Запуск физических симуляций в открытом мире
Боевая система в DrakkenRidge основана на сочетании уникальных анимаций и физического поведения каждого сустава. Каждый ИИ решает, как сделать свою смерть реактивной и вознаграждающей в зависимости от ситуации.
Сочетание физики отдельных суставов с программируемой анимацией позволяет создавать уникальные реакции.
В DrakkenRidge многие предметы и заклинания позволяют игроку наносить урон нескольким врагам одновременно, что часто приводит к необходимости одновременного запуска физических симуляций на множестве моделей персонажей.
Применение физики взрывов к группам искусственного интеллекта
Физические оптимизации
Моделирование физических процессов в реальном времени может быть дорогостоящим, особенно на мобильных платформах. Чтобы смягчить эту проблему, каждый физический объект в мире отслеживает местоположение игрока и то, находится ли игрок в положении, позволяющем взаимодействовать с симуляцией.
Например, игрок может взбираться по длинным цепям, построенным из взаимодействующих друг с другом и с окружающим миром звеньев, управляемых физическими законами. Эти физические коллайдеры, соединения и твердые тела динамически включаются/отключаются в зависимости от того, манипулирует ли игрок цепью напрямую или находится в поле зрения игрока.
Как правило, мы отображаем объекты на больших расстояниях, но допускаем физическое взаимодействие только с объектами, находящимися поблизости. В VR-играх, где действие происходит вблизи, это соответствует ожиданиям игрока.
Дальнейшая оптимизация
Принимая решение об оптимизации рендеринга для мобильной виртуальной реальности, мы учитывали особенности построения каждой среды и выбрали решение, наилучшим образом соответствующее нашим потребностям.
Помимо ECS, мы рассмотрели различные методы, включая LOD и методы создания ложных срабатываний .
Уровни детализации игровых объектов (GameObject LODs)
Рендеринг GameObjects с использованием уровней детализации (LOD) заключается в создании нескольких версий одного и того же объекта, которые отображаются на разных расстояниях от игрока. Например, высокодетализированная модель дома заменяется на очень упрощенную версию с низким количеством полигонов, что позволяет сэкономить время рендеринга, когда игрок находится далеко от объекта.
В DrakkenRidge каждый объект уже смоделирован в высокооптимизированном низкополигональном ретро-стиле, и большая часть игрового мира обрабатывается с помощью ECS, поэтому традиционные 3D LOD не дадут реального преимущества.
Однако дистанционное создание контентаСозданная нами система предназначена для обработки рендеринга уровней детализации (LOD) для удаленных Entities, когда это необходимо.
Самозванцы
Система обмана берет 3D GameObjects и преобразует их в 2D рекламные щиты, когда игрок находится на расстоянии от них. Этот метод лучше всего подходит для плотных, удаленных фоновых объектов, таких как леса. DrakkenRidge в некоторых ситуациях использует самозванцев.

Правильно реализованные подделки неотличимы от своих 3D аналогов.
В DrakkenRidge мы протестировали множество методов оптимизации, тщательно выбирая, какие из них следует реализовать. Unity ECS обеспечила наибольший прирост производительности, отрисовав весь наш мир с минимальными затратами по сравнению с использованием традиционного конвейера обработки игровых объектов.
Заключительные мысли
Для компании DrakkenRidge наше сочетание методов проектирования и оптимизации оказалось идеальным рецептом, позволившим нам создать уникальное VR-приключение. Открытый мир создан на основе ECS для Unity, а взаимодействие с объектами крупным планом разработано с использованием привычного рабочего процесса GameObject и физики, что позволяет команде быстро проектировать, тестировать и дорабатывать игру.
Открытые ролевые игры для мобильных VR-платформ не обязательно должны быть недоступны, и мы с нетерпением ждём, когда всё больше разработчиков возьмутся за это приключение!

Игра DrakkenRidge VR уже доступна . Узнайте больше об играх, Made with Unity, на нашей странице куратора Steam , а также ознакомьтесь с другими историями от разработчиков Unity в блоге Unity и центре ресурсов .