Як я можу зменшити вплив продуктивності відображення дерев?


24

Я роблю низькополістичну стилізовану гру. У мене місцевість з водою, і я хочу багато-багато дерев; На даний момент у мене розміщено 10 000 дерев. Кожне дерево складається не більше 200 трикутників, тому вони не надто оподатковуються.

Основна проблема в тому, що є озера, а озера досить великі. Насправді ви не можете побачити жодного дерева з іншого боку озера, і це виглядає дуже погано, особливо коли ви ходите туди і раптом з’являються дерева.

Щоб виправити це, я повинен збільшити відстань до дерева, щоб ви могли бачити пристойну кількість дерев з іншого боку озера, але це знижує продуктивність до 40-50 кадрів в секунду, і ще майже нічого в грі ще немає. Я використовую GTX 1080, якщо це допомагає.

Що я можу зробити, щоб гра швидше працювала з більшою кількістю дерев?


IIRC, Silent Hill використовував туман, щоб приховати зріз у дальній площині відсікання, що дозволило їм почати динамічно завантажувати речі лише за межами місця, де відсікається туман. Ви можете отримати користь від зміни атмосфери гри.
Коді

Дерева залучають вас дивитися у вікно, тим самим знижуючи продуктивність.
mbomb007

Ви спробували запустити профайлер? Якщо так, то де вузьке місце?
Mikael Högström

Ви робите будь-який вигляд фрустуму?
Критичний

Що таке випадання фрустуму?
mr-matt

Відповіді:


43

Є кілька речей, які можна зробити для підвищення продуктивності малювання.

  1. Ви сказали, що вони досить далеко. Ви можете використовувати LOD для зменшення кількості вершин цих дерев і, таким чином, скорочуючи час, необхідний для проходження всіх вершин, що малюються. Незважаючи на те, що це, швидше за все, не проблема (GTX1080 з 10 к. Дерев по 200 трісів кожен, чіткі цифри для gpu), я все ж включив його. Білборд - це ефективний інструмент для найнижчого рівня LOD, оскільки це, по суті, плоска площина, яка завжди стикається з камерою із відтвореним зображенням дерева на ній. Він втрачає відчуття глибини, і тому це добре для найнижчого рівня, оскільки гравець, швидше за все, не помітить різниці.

  2. Ви ввімкнули групування ? Динамічне дозування зазвичай проводиться автоматично, якщо кількість вершин сіток досить низька. Статичну групування можна також спробувати зробити дерева дерева статичними, встановивши прапорець у редакторі єдності на батьківському ігровому об'єкті. Це не добре працює з анімованими об’єктами. Щоб зробити цю роботу, об'єкти мають спільний матеріал.

  3. Спеціальне дозування дозволяє контролювати візуалізацію, генеруючи шматки самостійно, замість того, щоб дозволити єдності обробляти це, а також дозволяє створювати пакетну групу для великих мереж. Це легко робиться Mesh.CombineMeshes . Це також не добре працює з анімованими об’єктами. Щоб зробити цю роботу, об'єкти мають спільний матеріал. Ви, мабуть, хочете розділити свій світ на якісь шматки і створити з них партії. Те, як ці шматки повинні бути створені, насправді залежить від того, як рухається ваша камера у світі.

  4. Увімкніть екземпляр на шейдерах. Моменталізація дозволяє двигуну малювати декілька об'єктів (з однією і тією ж сіткою) лише одним дзвінком дзвінка. Для цього вам потрібні об'єкти, що мають спільну мережу та спільний шейдер. Матеріал може змінюватися, але шейдер повинен підтримувати всі різні властивості.

    Для того, щоб двигун краще створив партії інстальованої візуалізації, ви, мабуть, хочете згрупувати одні і ті ж сітки разом у сцені. Також гра з чергою відображення матеріалів дасть хороші результати, якщо одна сітка завжди має однаковий матеріал. Під час розробки мобільної гри, над якою я зараз працюю, я використовував це, щоб зменшити виїзд більш ніж на половину в моїй тестувальній сцені. Крім того, оскільки Unity 5.6 переконайтеся, що ви поставили Enable Instancingпрапорець у цьому матеріалі.

  5. Замовчуйте зворотній дзвінок та виклики SetPass загалом. Це необоротні дзвінки вашого графічного процесора для малювання матеріалів, і вони мають великі накладні витрати. Зменшення недоліків (що робить дозування та інстанції) підвищить загальну продуктивність, яку може забезпечити ваш процесор, оскільки для цього потрібно набагато менше очікування. Виклики SetPass - це зміни ваших поточних шейдерів, тому якщо у вас багато різних матеріалів, у вас буде кілька викликів SetPass, які також змушують процесор трохи почекати.

  6. Якщо ваша сцена величезна і ваш процесорний час йде на перегляд усіх об'єктів на сцені, спробуйте зменшити об'єкти в сцені. Згрупуйте деякі дерева замість того, щоб розміщувати їх наочно і мати їх як єдиний об’єкт. Також переконайтеся, що ви не переміщуєте дерева чи батьківські об'єкти, оскільки це змушує Unity відкинути кешовані перетворення та перерахувати все дерево сцен.

  7. Якщо ваша сцена величезна, а ваш процесорний час все ще йде в Unity, проходячи по дереву сцен, щоб скласти списки для відображення всіх об'єктів, одне, що ви могли зробити, - це не дати Unity обробляти візуалізацію. Якщо у вас є кращий спосіб відстежувати об’єкти, що малюються, ви можете використовувати CommandBuffer.DrawMeshInstanced або Graphics.DrawMeshInstanced, щоб намалювати їх вручну. Я не буду детально розповідати про це, оскільки це набагато досконаліше і передбачає відсіч себе і чого іншого.

У разі, якщо статична або динамічна партія не працює належним чином (що ви можете побачити, перевіривши налагоджувач кадру), вам потрібно переконатися, що ви справді використовуєте спільний матеріал, і не робите копії матеріалу випадково при виклику meshRenderer.material. Якщо ви зателефонуєте .material, зробіть копії ваших матеріалів і розірвете пакетну групу. Використовуйте .sharedMaterialзамість цього.

Оскільки Unity 5.6, ви можете використовувати налагоджувач кадрів, щоб визначити, чому певні риски виклику не з'єднуються з попередніми викликами. Це буде дуже корисно, намагаючись зменшити недоліки вашої гри.

Моніторинг має такі переваги перед статичною / динамічною / спеціальною партією:

  • Використовує менше пам'яті, оскільки сітка не повинна дублюватися в пам'яті
  • Можна використовувати декілька матеріалів, потрібен лише загальний шейдер
  • Об'єкти можна анімувати

Крім того, як мінус, це досить нова функція в Unity і може бути трохи нестабільною. Також старі GPU або мобільні пристрої не обов'язково підтримують інстанції.


1. Так, я спробував ЛОД, і, на мій подив, насправді це погіршило. У мене було 3 варіації дерев, кожне з дещо нижчим числом вершин, і одна плоска площина з відтвореним зображенням дерева на ньому.
mr-matt

2. Усі мої дерева позначені як статичні. Наскільки я знаю, що дає змогу створювати пакетне? Це правильно? І коли ви говорите спільний матеріал, ви просто маєте на увазі, дерева мають той самий матеріал?
mr-matt

3. Яке покращення ефективності цього насправді призвело б? Чи варто спробувати?
mr-matt

1
2/3: На моєму досвіді Unity не дуже добре працює в динамічному дозуванні, а статичне дозування збільшує розмір збірки, тому я реалізував пакетну групування сам і робив сітку, поєднуючи час завантаження. Використовуючи цю техніку, мені вдалося зробити 2500 тяг, щоб стиснути приблизно на 300 тяг, що було вирішальним для нашої мобільної гри, де важливі риси. Це зробило небагато зайвих вершин для обчислення (поза екраном), але воно того варте.
Лассе

2
tfw, коли ви читаєте запитання про низьку продуктивність з деревами, і жодне слово про рекламний щит не втрачається
Num Lock

13

Гаразд, проблема полягала в тому, що я не використовував попередньо обчислений GI в реальному часі. Я перевіряю це на деякий час тому, але це не мало негайного ефекту, тому я залишив його і забув про це, і час обробки освітлення також був таким довгим. Однак я лише закінчив її обробку, і моє слово, мій кадр в секунду підскочив на 3 рази. Тож поки що я залишу це на цьому і в майбутньому переконуюсь, що я завжди використовую передпрограмний GI в реальному часі!

Якщо все-таки є щось, що я міг би зробити для покращення ефективності, будь ласка, дайте мені знати, я був би дуже вдячний!


2
Використовуйте Оклюзійні вилучення, також якщо ваша сцена велика - подумайте розділити її на шматки, наприклад, багато місцевості та завантажте та розвантажте їх.
відвертий Місяць _Max_

Зважаючи на те, що, здається, ви вирішили свою проблему, ви, ймовірно, повинні прийняти цю відповідь.
Gnemlock
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.