Оптимизация 3D-производительности

Выбраковка

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

Отбраковка окклюзии

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

Всё не так плохо, как кажется, поскольку Z-буфер обычно позволяет графическому процессору полностью затенять только объекты, находящиеся на переднем плане. Это называется предварительным проходом глубины и включено в Godot по умолчанию при использовании методов рендеринга Forward+ или Compatibility. Однако ненужные объекты всё равно снижают производительность.

One way we can potentially reduce the amount to be rendered is to take advantage of occlusion. Godot offers an approach to occlusion culling using occluder nodes. See Отбраковка окклюзии for instructions on setting up occlusion culling in your scene.

Примечание

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

Прозрачные объекты

Godot сортирует объекты по Material и Shader для повышения производительности. Однако это невозможно сделать с прозрачными объектами. Прозрачные объекты визуализируются сзади наперёд, чтобы обеспечить смешивание с тем, что находится позади. Поэтому старайтесь использовать как можно меньше прозрачных объектов. Если у объекта есть небольшой участок с прозрачностью, попробуйте сделать этот участок отдельной поверхностью с собственным материалом.

Более подробную информацию см. в документе GPU optimizations.

Уровень детализации (LOD)

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

Godot 4 предлагает несколько способов управления уровнем детализации:

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

Дальности видимости также являются хорошим способом настройки imposters (самозванцев) для удаленной геометрии (см. ниже).

Рекламные щиты и самозванцы (imposters)

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

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

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

Использовать автоматическое создание экземпляров

Это реализовано только в рендерере Forward+, но не в Mobile или Compatibility.

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

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

Использовать ручное создание экземпляров (MultiMesh)

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

См. также документацию Using MultiMesh.

Освещение для выпечки

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

Рассмотрите возможность использования запечённого освещения, особенно для мобильных устройств. Это может выглядеть потрясающе, но есть и недостаток: оно не будет динамичным. Иногда это оправданный компромисс.

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

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

Анимация и скины

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

Для этой цели могут быть полезны узлы VisibleOnScreenEnabler3D и VisibleOnScreenNotifier3D.

Большие миры

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

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

Также возможны сбои в рендеринге и физике из-за ошибок с плавающей точкой в больших мирах. Эту проблему можно решить с помощью Большие мировые координаты. Если использование больших мировых координат невозможно, можно использовать такие приёмы, как ориентация мира вокруг игрока (а не наоборот) или периодическое смещение начала координат, чтобы всё оставалось центрированным относительно Vector3(0, 0, 0).