Усі статті
Туторіали · 8 min read

Густа рослинність без рахунку за фреймрейт: практичний посібник

Як наповнити сцену рослинністю і тримати її швидкою, інстансинг, дистанції відсікання, стратегія LOD, вартість тіней, овердро, розміщення щільності та цикл профілювання з фіксованою камерою, що доводить: кожна оптимізація справді окупилася.

Illustration of a row of trees next to a rising frame-rate graph

Коротко: густу рослинність рідко вбиває саме лише число трикутників. Вона гине від тисячі 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'а без повторення роботи вручну.

Виглядати густо й бути швидким — це не суперечність; це здебільшого дисципліна робити п'ять речей у правильному порядку й доводити кожну однією й тією ж камерою.