Коротко: густую растительность редко убивает одно лишь число треугольников: она гибнет от тысячи draw call'ов, овердро от небрежных альфа-карт и теней, о включённости которых никто не помнил. Тратьте усилия в этом порядке: инстансинг сначала, дистанции отсечения вторым, тени третьим, LOD'ы четвёртым, размещение плотности пятым, и проверяйте каждый шаг одной и той же фиксированной камерой, по одной переменной за раз, иначе ничему не научитесь. Это руководство разбирает каждую стадию с сигнатурой профайлера, что говорит вам: это ваша проблема.
Настоящий лес рендерится «бесплатно», потому что физика массово параллельна. Ваша GPU может подделать вид на 60 fps, но только если вы перестанете саботировать машинерию, которую движки уже поставляют ровно для этой задачи.
Ментальная модель: пять узких мест, один порядок
Производительность растительности складывается не из одной проблемы, а из пяти, и они доминируют в предсказуемой последовательности. Draw call'ы первыми связывают CPU; дистанция отсечения решает, сколько вы вообще просите GPU нарисовать; тени молча удваивают стоимость всего, что их отбрасывает; LOD'ы и овердро правят пиксельным счётом; а размещение плотности решает, сколько всего этого вам на деле было нужно. Атакуйте их не по порядку, и оптимизируете то, что не было узким местом. Ниже порядок именно такой, в котором стоимость реально кусает.
Инстансинг сначала, всё остальное потом
Одно дерево, отрисованное 5000 раз, радикально дешевле 5000 отдельных деревьев: оба движка батчат повторяющиеся меши в инстансированные draw'ы, и первым делом просто не саботируйте эту машинерию.
Unreal батчит через foliage и hierarchical instanced static meshes; Unity — через GPU-инстансинг и terrain-детали. Что молча ломает батчинг:
- растительность, размещённая как уникальные акторы/объекты вместо инстансов;
- поинстансные варианты материала: используйте поинстансные данные (цвет, масштаб) внутри одного материала вместо создания материала на каждый вид;
- размещение, разбросанное организационно, так что движок не может отсекать кластеры как единицы.
Сигнал профайлера однозначен: draw call'ы, масштабирующиеся с числом растений. Если вид леса показывает тысячи draw call'ов, чините это до всего прочего: ничто ниже по списку вас не спасёт, потому что вы CPU-bound ещё до старта GPU. Здоровая инстансированная растительность держит draw call'ы в низких сотнях для целого вида леса, сколько бы тысяч растений в нём ни было.
Дистанции отсечения: бесплатные деньги
Траве не нужно рендериться за 800 метров: задайте дистанции отсечения по типу (почвопокров 30–60 м, кусты 100–200 м, только деревья заслуживают дальних дистанций) с диапазонами фейда, чтобы скрыть попинг.
Это настройка с наивысшей ценностью в минуту во всём пайплайне, и её рутинно оставляют на «бесконечности», потому что там она по умолчанию и никто не замечает. Обоснование перцептивно: почвопокров стягивает меньше пикселя задолго до 100 м: он буквально ничего не вносит в финальное изображение, всё ещё стоя вертексов, овердро и работы теней каждый кадр. Дальнее покрытие принадлежит более дешёвым системам: цвету terrain-материала, непрозрачным импосторам или просто дальнему LOD'у terrain-слоя, покрашенному в правильный зелёный.
Диапазоны фейда (дизеринг или альфа) прячут выскакивание, чтобы игроки не видели самой дистанции отсечения. Настройте фейд ровно настолько длинным, чтобы быть невидимым, и не длиннее: слишком длинный фейд значит, что вы платите за два представления одного растения во время кроссфейда.
Тени: молчаливая половина счёта
Выключите динамический сброс теней для мелкого почвопокрова, оставьте его для деревьев, ограничьте по дистанции для кустов: тени травы удваивают вашу стоимость при почти нулевой визуальной отдаче.
Каждая травинка в проходе теней рисуется снова, с точки зрения света. В густых сценах проход теней часто стоит столько же, сколько базовый проход, а значит, тени травы могут быть крупнейшей отдельной статьёй всего бюджета растительности, будучи визуально неотличимыми от простого фонового затемнения у основания пучка. Лекарство почти бесплатно: сброс теней выключен для почвопокрова, включён для деревьев (их тени делают реальную композиционную работу), ограничен по дистанции для промежуточного. Затем проверьте проход теней в профайлере до и после: обычно это крупнейшая единичная победа после инстансинга, и занимает минуты.
LOD'ы: бюджетируйте силуэт, а не полигоны
Хорошая LOD-цепь растительности сохраняет контур и вырезает нутро: проверяйте дистанции перехода на глаз и оптимизируйте жёстче всего последний mesh-LOD перед импостором, потому что именно он на экране в каждом широком плане.
Именно на растениях нижнего яруса, как эти, настройки дистанции отсечения и тени окупаются больше всего: тысячи инстансов, каждый вносит почти ничего за пределами нескольких десятков метров, каждый удваивается в стоимости, если отбрасывает динамическую тень.
Практичная цепь для геройского дерева: полный меш → редукция нутра ~50 % (тот же силуэт) → ~15 % со слитыми картами → непрозрачный импостор/билборд. Две заметки, что берегут реальную боль:
- Даже в движках с виртуализированной геометрией дальние импосторы остаются оправданными, потому что овердро и тени остаются реальной стоимостью независимо от того, как оплачиваются треугольники. Виртуализированная геометрия решает число треугольников, а не стоимость прозрачности.
- Прозрачность — враг на дистанции. Плотные альфа-тестированные карты складывают овердро ровно там, где GPU слабее всего, на средних LOD'ах. Предпочитайте мешевые листья вблизи и непрозрачные импосторы вдали; альфа-нагруженная середина, там прячется кадровое время. Если один LOD загадочно дорог, это почти всегда прозрачный.
Овердро: стоимость, которую вы не видите
Овердро — это GPU, шейдящая один и тот же пиксель много раз сквозь наслоённые прозрачные поверхности, специфическое проклятие растительности, невидимое на финальном изображении и часто причина, почему «лёгкая» сцена тормозит.
У большинства движков есть режим визуализации овердро; включите его и посмотрите на поле травы. Если оно светится белым, вы шейдите каждый пиксель по пять-десять раз, пока накапливаются перекрывающиеся альфа-карты. Смягчения: меньше, крупнее травинки вместо многих тонких; непрозрачная геометрия там, где позволяет силуэт; и агрессивное отсечение карт, что вносят меньше всего. Овердро часто оказывается классическим виновником «моя сцена тормозит, но ничего не выглядит дорогим», потому что треугольники дёшевы, а пиксели оплачиваются многократно.
Плотность: дизайнерское решение, а не позиция ползунка
Густо там, где игрок идёт и смотрит, редко где нет: 20-метровая полоса богатой детали вдоль тропы читается как «пышно везде» за долю от равномерной стоимости.
Маски уклона и высоты делают часть этого автоматически (крутые грани и дальние плато вовсе не нуждаются в почвопокрове), а кластеризация делает остальное: пучки с промежутками рендерятся дешевле равномерного заполнения и выглядят естественнее, так что выигрыш производительности и выигрыш красоты указывают в одну сторону. Здесь инструменты размещения окупаются: рисовать плотность масками и правилами по видам, затем запекать прямо в нативные инстансы движка — это разница между полднем и неделей. Это ядро того, что делает scatter от Numivo, и поскольку оно запекает в обычный foliage и инстансированные меши, каждая техника этой статьи применяется к результату без изменений. Между вами и стандартными оптимизациями нет плагинного рантайма; запечённая сцена — просто контент движка.
Цикл профилирования
Та же камера, тот же вид, одна переменная за раз: измеряйте GPU-кадровое время, draw call'ы, проход теней и овердро после каждого изменения.
Выберите фиксированную «бюджетную камеру» в самой густой висте и скриньте статы до и после каждого шага выше. Дисциплина важна, потому что оптимизации растительности взаимодействуют: изменение дистанции отсечения меняет, сколько инстансов видит проход теней; изменение LOD меняет овердро; изменение плотности меняет всё сразу. Случайные пролёты дают случайные числа и нефальсифицируемые споры о том, помогло ли изменение. Фиксированные камеры дают решения, которые можно защитить. Держите числа в общей таблице, и линия тренда расскажет вам историю, которую единичный замер не может.
Полевые цифры, которые стоит украсть
- Отсечение почвопокрова: 30–60 м · кусты: 100–200 м · деревья: линия обзора
- Draw call'ы для здорового инстансированного вида леса: низкие сотни
- Доля прохода теней в густых сценах: часто ~половина стоимости растительности. Выключенные тени травы — самая дешёвая большая победа из существующих
- Ширина полосы дрессинга вдоль тропы, читающейся «пышно везде»: ~20 м
- Число LOD для геройского дерева: 3 mesh-LOD + непрозрачный импостор
- Целевой овердро для травы: меньше ~3× в виде овердро, а не светящиеся-белые 8–10× наслоённых альфа-карт
Мини-FAQ
Делает ли Nanite / виртуализированная геометрия это устаревшим? Она меняет, какие статьи доминируют, а не дисциплину. Овердро от альфа-карт, стоимость теней и поинстансные накладные никуда не деваются, и импосторы на дистанции по-прежнему окупаются. Мерьте на целевом железе, а не предполагайте, что новая технология решила ваше конкретное узкое место: она могла его лишь сместить, а не убрать.
Почему моя сцена тормозит даже при низкой плотности? Обычные подозреваемые, по порядку: трава, отбрасывающая динамические тени, уникальный материал на вариант, саботирующий батчинг, дистанции отсечения на бесконечности, или альфа-тестированная LOD-цепь, складывающая овердро. У каждого своя сигнатура профайлера: проверьте перед изменением, иначе почините не тот.
Когда густо становится «слишком густо» для геймплея? Читаемость боя ограничивает плотность раньше производительности: если силуэты исчезают в хламе, игроки винят игру, не дрессинг. Густо в висте, умеренно на арене: паттерн, что переживает и профайлер, и плейтест.
Запекать или держать процедурным? Запекайте для релиза: запечённые инстансы профилируются честно и релизятся без рантайм-зависимости. Держите процедурную настройку (маски, правила, сиды) в контроле версий, чтобы перепечь после изменения terrain'а без повторения работы вручную.
Выглядеть густо и быть быстрым — не противоречие; это в основном дисциплина делать пять вещей в правильном порядке и доказывать каждую одной и той же камерой.