This page has been translated automatically.
Видеоуроки
Интерфейс
Основы
Продвинутый уровень
Подсказки и советы
Основы
Программирование на C#
Рендеринг
Профессиональный уровень (SIM)
Принципы работы
Свойства (properties)
Компонентная Система
Рендер
Физика
Редактор UnigineEditor
Обзор интерфейса
Работа с ассетами
Контроль версий
Настройки и предпочтения
Работа с проектами
Настройка параметров ноды
Setting Up Materials
Настройка свойств
Освещение
Sandworm
Использование инструментов редактора для конкретных задач
Расширение функционала редактора
Встроенные объекты
Ноды (Nodes)
Объекты (Objects)
Эффекты
Декали
Источники света
Geodetics
World-ноды
Звуковые объекты
Объекты поиска пути
Player-ноды
Программирование
Основы
Настройка среды разработки
Примеры использования
C++
C#
UnigineScript
Унифицированный язык шейдеров UUSL (Unified UNIGINE Shader Language)
Плагины
Форматы файлов
Материалы и шейдеры
Rebuilding the Engine Tools
Интерфейс пользователя (GUI)
Двойная точность координат
API
Animations-Related Classes
Containers
Common Functionality
Controls-Related Classes
Engine-Related Classes
Filesystem Functionality
GUI-Related Classes
Math Functionality
Node-Related Classes
Objects-Related Classes
Networking Functionality
Pathfinding-Related Classes
Physics-Related Classes
Plugins-Related Classes
IG Plugin
CIGIConnector Plugin
Rendering-Related Classes
VR-Related Classes
Работа с контентом
Оптимизация контента
Материалы
Визуальный редактор материалов
Material Nodes Library
Miscellaneous
Input
Math
Matrix
Textures
Art Samples
Учебные материалы
Внимание! Эта версия документация УСТАРЕЛА, поскольку относится к более ранней версии SDK! Пожалуйста, переключитесь на самую актуальную документацию для последней версии SDK.
Внимание! Эта версия документации описывает устаревшую версию SDK, которая больше не поддерживается! Пожалуйста, обновитесь до последней версии SDK.

Работа с виртуальным миром

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

Уровни детализации#

Чем проще геометрия 3D-объектов, тем меньше нагрузка на рендер. Поэтому при увеличении расстояния между камерой и объектами имеет смысл плавно переключаться между уровнями их детализации (LOD-ами) в режиме прозрачности Alpha Blend.

В UNIGINE предусмотрено два механизма смены LOD-ов:

  • Выключение одного LOD-а и включение другого на определенном расстоянии, которое задается двумя значениями: конец видимости первого LOD-а (Max Visibility) и начало видимости второго LOD-а (Min Visibility).

  • Плавный переход (fade) между LOD-ами в указанном интервале, который задается двумя значениями: расстояние плавного появления первого LOD-а (Min Fade) и расстояние плавного исчезновения первого LOD-а / расстояние плавного появления второго LOD-а (Max Fade).

Настройки LOD-ов поверхностей находятся в секции LOD вкладки Node в окне Parameters. Доступны следующие параметры:

Границы видимости

Видимость LOD-ов определяется диапазоном видимости. Он задается двумя параметрами: начало и конец видимости, которые определяются по расстоянию от камеры. Поверхность отображается только в том случае, если она находится в пределах этого диапазона.

  • Начало видимости (Min Visibility) — это расстояние от камеры, начиная с которого поверхность видна на экране. По умолчанию для него задается значение -inf.
  • Конец видимости (Max Visibility) — это расстояние от камеры, начиная с которого поверхность не отображается полностью: она может сразу полностью исчезнуть или начать плавно исчезать. По умолчанию для этого параметра задается значение inf.
Примечание
У поверхностей, которые представляют собой разные LOD-ы одного и того же объекта, диапазоны видимости не должны совпадать даже частично.
Расстояния перехода между LOD-ами

При переключении между LOD-ами может обнаружиться один заметный визуальный дефект — резкая смена изображения. Плавное превращение одного LOD-а в другой делает смену LOD-ов менее заметной.

Примечание
Плавный переход между LOD-ами в режиме Alpha Blend возможен, только когда для render_alpha_fade установлено значение 1 (задано по умолчанию).

Интервал плавного перехода задается аналогично диапазону видимости при помощи значений Min Fade и Max Fade:

  • Поверхность плавно появляется, начиная с заданного в Min Visibility расстояния и до тех пор, пока не станет полностью видимой на расстоянии Min Visibility + Min Fade. На всем протяжении Min Fade движок автоматически интерполирует уровень детализации, начиная от значения alpha равного 0,0 (полностью невидимый) до 1,0 (полностью непрозрачный).
  • После превышения заданного в Max Visibility расстояния поверхность начинает плавно исчезать на протяжении заданного расстояния Max Fade по тому же принципу.

Несмотря на то что переход между LOD-ами в режиме Alpha Blend визуально улучшает изображение, нужно помнить и о том, что в диапазоне плавного перехода одновременно отрисовываются обе версии одного и того же объекта. Поэтому диапазон плавного перехода следует делать по возможности минимальным.

Visibility distance
Поверхность в пределах видимости
Fade distance
Расстояние плавного перехода

Например, у нас есть два LOD-а: высокополигональный surface_lod_0 и низкополигональный surface_lod_1, и нам нужно сделать плавный переход между этими двумя LOD-ами.

  1. Мы хотим, чтобы смена LOD-ов происходила на расстоянии 50 единиц. Для этого нужно состыковать друг с другом их границы видимости:

    • Поверхность первого LOD-а surface_lod_0 должна отображаться, когда камера находится вблизи объекта. Поэтому задаем значение -inf для начала видимости (Min Visibility). А для конца видимости (Max Visibility) выставляем значение 50 единиц от камеры.
    • На большем расстоянии сразу же включается поверхность второго LOD-а surface_lod_1. Она видна на расстоянии от 50 единиц (которое указано в Min Visibility) — и до бесконечности (Max Visibility = inf).
  2. Переключение между LOD-ами происходит довольно резко. Для плавного исчезновения (для первого LOD-а) и появления (для второго LOD-а) указываются симметричные расстояния. К примеру, установим диапазон плавного перехода равный 5 единицам.

    • Для плавного исчезновения первого LOD-а указываем значение Max Fade равное 5.
    • Для плавного появления второго LOD-а, указываем значение Min Fade равное 5.

В результате для LOD-ов будут применяться следующие значения:

От ограничивающего контура объекта
до расстояния 50 единиц
Полностью видна только поверхность первого LOD-а surface_lod_0
50 — 55 единиц Первый LOD плавно исчезает, а второй LOD плавно появляется
От 55 единиц и дальше Полностью видна только поверхность второго LOD-а surface_lod_1

Опорный объект#

Система уровней детализации включает еще один параметр — опорный объект. Этот параметр задает границы, от которых отмеряется расстояние перехода между LOD-ами. Можно отмерять расстояние от самой поверхности или от какой-либо из поверхностей или нод выше по иерархии в этой ветке. Для каждой поверхности указываются два опорных объекта:

Min Parent

Опорный объект, от которого определяется расстояние до начала видимости (Min Visibility):

  • 0 — сама поверхность.
  • 1 — означает, что опорный объект находится на один уровень выше в данной иерархии:

    • сначала переход вверх по уровням осуществляется по иерархии поверхностей (если эти уровни существуют);
    • затем происходит переход по иерархии нод.

    Например, если у поверхности нет родительских поверхностей, то 1 обозначает объект, которому эта поверхность принадлежит.

  • Увеличение числа просто смещает опорный объект вверх через все родительские поверхности, а затем — все родительские ноды.
Max Parent Опорный объект, от которого определяется расстояние до конца видимости (Max Visibility). Задается в соответствии с тем же самым подходом.

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

Примечание
Объединение нескольких поверхностей в одну снижает количество отрисовываемых объектов, тем самым сокращая количество вызовов DIP и увеличивая скорость рендеринга.
Высокополигональная модель
Высокополигональная модель
 
Низкополигональная модель
Низкополигональная модель, используемая
в качестве менее детализированной поверхности

Проблема заключается в том, что у всех этих детализированных поверхностей разные ограничивающие контуры (bounding box). Поэтому если границы видимости измеряются от самих поверхностей (установлено значение 0 для Min Parent и Max Parent), может произойти ситуация, когда смена LOD-ов различных частей дома происходит неравномерно, так как их границы находятся на разном расстоянии от камеры. Это может спровоцировать визуальный дефект под названием z-fighting, когда одна поверхность проглядывает сквозь другую. В нашем примере на рисунке ниже дальний угол еще не переключился на более детализированную поверхность, а ближний отрисован дважды: высокополигональный угол дома одновременно с низкополигональной поверхностью, представляющей весь дом целиком.

Два LOD-а включены одновременно

Измерение расстояния до поверхности LOD-а может спровоцировать дефект: одновременное включение двух LOD-ов

Если мы выставим в качестве опорного объекта ограничивающий контур всего дома (значение 1 для Min Parent и Max Parent), то все поверхности будут переключаться одновременно независимо от того, с какой стороны мы приближаемся к дому.

Еще один вариант — использовать при проверке разные опорные объекты для различных поверхностей. Например, начало видимости (Min Visibility) проверяется относительно самой поверхности, а конец видимости (Max Visibility) — относительно родительской ноды. Разберем на примере кольца, разбитого на поверхности в зависимости от уровня детализации.

Уровни детализации кольца

Уровни детализации кольца. Поверхность слева является родителем для поверхности справа

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

Обратите внимание, что все точки начала видимости (Min Visibility) здесь измеряются от самой поверхности, а точки конца видимости (Max Visibility) — от другого опорного объекта, родителя. Следующая иллюстрация поможет вам понять, зачем это сделано.

Использование различных опорных объектов

Пример измерения расстояния от различных опорных объектов

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

Расстояния измеряются от различных опорных объектов, чтобы правильно "выключать" самые маленькие сектора и отображать вместо них более крупный сектор. Конец видимости (Max Visibility) рассчитывается от родительского сектора, поскольку расстояния до смежных подсекторов могут существенно различаться. Начало видимости (Min Visibility) рассчитывается от текущего сектора, поскольку нам нужно его показать, если камера находится слишком близко к нему.

Границы#

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

Такой подход значительно уменьшает размер дерева и повышает производительность за счет экономии времени на пересчет привязки при преобразовании таких узлов.

Используются следующие типы границ:

  • Local Bounds - привязанные объекты с локальными координатами, которые не учитывают физику и дочерние элементы: BoundBox и BoundSphere.
  • World Bounds - то же, что и локальные, но с мировыми координатами: WorldBoundBox и WorldBoundSphere.
  • Spatial Bounds - привязанные объекты с мировыми координатами, используемыми пространственным деревом и, следовательно, учитывающими физику (границы формы и т.д.): SpatialBoundBox и SpatialBoundSphere.
Примечание
границы Spatial вычисляются быстрее, чем границы World.

И их иерархические аналоги (с учетом всех дочерних элементов), которые будут использоваться там, где требуются иерархические границы (они медленны, но предлагают правильные вычисления):

  • Local Hierarchical Bounds - привязанные объекты с локальными координатами, учитывающими границы всех дочерних узлов: HierarchyBoundBox и HierarchyBoundSphere.
  • World Hierarchical Bounds - то же, что и локальные, но с мировыми координатами: HierarchyWorldBoundBox и HierarchyWorldBoundSphere.
  • Spatial Hierarchical Bounds - иерархически привязанные объекты, используемые пространственным деревом и, следовательно, учитывающие физику (границы формы и т.д.): HierarchySpatialBoundBox и HierarchySpatialBoundSphere.

Открытое пространство#

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

В Unigine разбиение пространства реализуется при помощи адаптивных BSP-деревьев с привязкой к осям координат.

Двоичное разбиение пространства#

Двоичное разбиение пространства — это метод разбиения сцены вдоль осей на участки, каждый из которых обрабатывается индивидуально, что упрощает работу со сценой. BSP-дерево представляет собой иерархическую структуру, которая создается посредством разделения и группирования всех данных сцены. Адаптивное поведение оптимизирует алгоритм двоичного разбиения пространства: размеры участков определяются пропорционально обрабатываемой геометрии и распределению объектов в мире.

BSP-дерево строится следующим образом:

Дерево двоичного разбиения пространства

  1. Сначала создается корневой узел: ограничивающий контур с привязкой к осям (AABB), который охватывает всю сцену.
  2. Затем пространство ограничивающего контура рекурсивно делится на два участка разбивающей плоскостью, которая перпендикулярна одной из трех основных осей. В итоге создается два узла дерева, каждый из которых заключается в ограничивающий контур с привязкой к осям. Этот шаг повторяется для каждого из этих узлов до тех пор, пока не будет представлена вся геометрия сцены.
  3. Процесс деления останавливается, когда достигается уровень с необходимым количеством нод.

    Примечание
    Если разбивающая плоскость на определенном этапе разбивает объект, то этот объект остается на предыдущем уровне и не спускается дальше по дереву. Такое часто происходит с масштабными объектами, такими как небо или большие здания.

Во время рендеринга движок проходит по всем узлам BSP-дерева и определяет, какие из ограничивающих контуров находятся в пределах пирамиды видимости. Если узел попадает в эти пределы, то проверка повторяется для его потомков до тех пор, пока не будет достигнут дочерний узел, который находится за пределами пирамиды видимости. Для видимых участков производятся все необходимые расчеты, а остальная часть сцены (т. е. объекты и их освещение) игнорируется.

Каждый раз при добавлении объекта в сцену, его удалении или изменении его статуса на коллизионный или clutter дерево автоматически пересоздается. Если изменений не вносилось, дерево остается прежним. Благодаря этому адаптивное двоичное разбиение пространства эффективно не только при отрисовке статичной геометрии, но и при работе с динамическими объектами.

Примечание
Включить визуализацию пространственного дерева можно при помощи консольной команды world_show_spatial.

Визуализация пространственного дерева

Визуализация пространственного дерева

Чтобы работа со сценой была эффективной, а дерево сбалансированным, для каждого типа нод создается свое дерево:

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

    Примечание
    Это пространственное дерево включает статичные объекты с включенным флагом Immovable, чтобы оптимизировать управление нодами.
  • Дерево освещения обрабатывает все источники освещения.
  • Дерево декалей обрабатывает декали.
  • Дерево камер обрабатывает все виды камер.
  • Дерево физических нод обрабатывает все физические силы.
  • Дерево звуков обрабатывает все источники звука.

Разбиение мешей#

После того как достигнут уровень нода, есть необходимость продолжить разбиение — на уровне меша. Разбивка происходит по тому же принципу: дерево должно быть бинарным и с привязкой к осям. Единственное различие в том, что эти деревья рассчитываются заранее (они генерируются при загрузке мира), поскольку меш является запеченным объектом, и необходимости в динамическом изменении соответствующих деревьев нет. Меш разбивается на следующие деревья:

  • дерево поверхностей;
  • дерево полигонов.

Эти два дерева обеспечивают основу для быстрых расчетов пересечений и коллизий с мешем.

Перспективная проекция#

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

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

Пирамида видимости

Пирамида видимости

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

Ортографическая проекция#

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

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

Прямоугольное поле видимости

Прямоугольное поле видимости
Примечание
Ортографический режим для камеры включается в поле Ortho в окне Camera Settings.

Отсечение невидимых объектов#

Еще один популярный способ оптимизации — исключение объектов, которые полностью скрыты за другими объектами, то есть зритель их не видит. Например, нет смысла рисовать комнату, которая находится за стеной, или цветы, скрытые сплошным забором. Эта техника называется отсечение загороженных объектов (occlusion culling). Частные случаи отсечения загороженных объектов:

  • загораживающие объекты (occluder);
  • потенциально видимые части пространства. Пространство делится на участки, в каждом из которых находится набор полигонов, видимых из любой точки внутри этого участка. В режиме реального времени программа рендеринга просто использует заранее рассчитанный участок с учетом положения камеры. Этот подход обычно используется для ускорения процесса двоичного разбиения пространства.
  • Окклюдеры
  • Потенциально видимые наборы, которые делят пространство на несколько областей, причем каждая область содержит набор полигонов, которые могут быть видны из любой точки внутри этой области. Затем, в режиме реального времени, средство визуализации просто просматривает предварительно вычисленный набор с учетом положения просмотра. Этот метод обычно используется для ускорения разбиения двоичного пространства.

Загораживающие объекты#

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

Существует два типа загораживающих объектов: загораживающий контур и загораживающий меш. Тип загораживающего объекта выбирается в зависимости от геометрии, которую необходимо отсечь.

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

Аппаратная проверка видимости#

Еще один способ отсечь геометрию, которая не видна, — использование аппаратной проверки видимости (hardware occlusion query). Такая проверка позволяет снизить число отрисовываемых полигонов, тем самым увеличивая производительность. Для запуска аппаратной проверки видимости в сцене включите флаг Rendering -> Features -> Occlusion query перед отправкой данных на графический процессор. Тогда будут отсекаться все объекты, у которых включен флаг Culled by occlusion query во вкладке Node окна Parameters.

Примечание
Консольная команда render_occlusion_queries включает отсечение для всех объектов в сцене.

При включении флага отсечения для объекта создается контур проверки видимости. Его размер совпадает с размером ограничивающего контура объекта. Объект будет отрисован только в том случае, если его контур проверки видимости попадает в обзор камеры (окно просмотра).

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

Обновление с пониженной частотой#

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

Периодическое обновление позволяет значительно снизить производительность. Список объектов, которые могут быть оптимизированы таким образом, включает следующее:

Для каждого из них может быть установлено значение Update Distance Limit - расстояние от камеры, в пределах которого объект должен быть обновлен.

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

вкладка Parameters → раздел Periodic Update
Примечание
Значения FPS не являются фиксированными и могут быть скорректированы движком в любое время для обеспечения наилучшей производительности.

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

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

Асинхронный стриминг данных#

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

Система стриминга асинхронно загружает в оперативную память следующие данные:

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

Более подробно о настройке стриминга написано в статье Асинхронный стриминг данных.

Многопоточное обновление нод#

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

Многопоточное обновление нод

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

Для различных типов нод существует три режима:

  • без обновления — для нод, которые не изменяются и не нуждаются в обновлении (Mesh Static, NodeDummy, Decal, PlayerDummy и т.д.), эти ноды пропускаются.
  • независимое обновление — для нод, которые гарантированно не имеют никакой иерархической логики, такие ноды автоматически помещаются в отдельные потоки, когда это необходимо:

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

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

    Следующие типы нод являются зависимыми от иерархии:

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

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

Кэширование нод#

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

При попытке доступа к кэшированной ноде, важно помнить, что:

  • Если нода загружается по имени — нода и сохраняется в кэше по своему имени.
  • Если нода загружается из родительской Node Reference — нода сохраняется в кеше по ее GUID.
Последнее обновление: 12.07.2024
Build: ()