Є кілька речей, які можна зробити для підвищення продуктивності малювання.
Ви сказали, що вони досить далеко. Ви можете використовувати LOD для зменшення кількості вершин цих дерев і, таким чином, скорочуючи час, необхідний для проходження всіх вершин, що малюються. Незважаючи на те, що це, швидше за все, не проблема (GTX1080 з 10 к. Дерев по 200 трісів кожен, чіткі цифри для gpu), я все ж включив його. Білборд - це ефективний інструмент для найнижчого рівня LOD, оскільки це, по суті, плоска площина, яка завжди стикається з камерою із відтвореним зображенням дерева на ній. Він втрачає відчуття глибини, і тому це добре для найнижчого рівня, оскільки гравець, швидше за все, не помітить різниці.
Ви ввімкнули групування ? Динамічне дозування зазвичай проводиться автоматично, якщо кількість вершин сіток досить низька. Статичну групування можна також спробувати зробити дерева дерева статичними, встановивши прапорець у редакторі єдності на батьківському ігровому об'єкті. Це не добре працює з анімованими об’єктами. Щоб зробити цю роботу, об'єкти мають спільний матеріал.
Спеціальне дозування дозволяє контролювати візуалізацію, генеруючи шматки самостійно, замість того, щоб дозволити єдності обробляти це, а також дозволяє створювати пакетну групу для великих мереж. Це легко робиться Mesh.CombineMeshes . Це також не добре працює з анімованими об’єктами. Щоб зробити цю роботу, об'єкти мають спільний матеріал. Ви, мабуть, хочете розділити свій світ на якісь шматки і створити з них партії. Те, як ці шматки повинні бути створені, насправді залежить від того, як рухається ваша камера у світі.
Увімкніть екземпляр на шейдерах. Моменталізація дозволяє двигуну малювати декілька об'єктів (з однією і тією ж сіткою) лише одним дзвінком дзвінка. Для цього вам потрібні об'єкти, що мають спільну мережу та спільний шейдер. Матеріал може змінюватися, але шейдер повинен підтримувати всі різні властивості.
Для того, щоб двигун краще створив партії інстальованої візуалізації, ви, мабуть, хочете згрупувати одні і ті ж сітки разом у сцені. Також гра з чергою відображення матеріалів дасть хороші результати, якщо одна сітка завжди має однаковий матеріал. Під час розробки мобільної гри, над якою я зараз працюю, я використовував це, щоб зменшити виїзд більш ніж на половину в моїй тестувальній сцені. Крім того, оскільки Unity 5.6 переконайтеся, що ви поставили Enable Instancing
прапорець у цьому матеріалі.
Замовчуйте зворотній дзвінок та виклики SetPass загалом. Це необоротні дзвінки вашого графічного процесора для малювання матеріалів, і вони мають великі накладні витрати. Зменшення недоліків (що робить дозування та інстанції) підвищить загальну продуктивність, яку може забезпечити ваш процесор, оскільки для цього потрібно набагато менше очікування. Виклики SetPass - це зміни ваших поточних шейдерів, тому якщо у вас багато різних матеріалів, у вас буде кілька викликів SetPass, які також змушують процесор трохи почекати.
Якщо ваша сцена величезна і ваш процесорний час йде на перегляд усіх об'єктів на сцені, спробуйте зменшити об'єкти в сцені. Згрупуйте деякі дерева замість того, щоб розміщувати їх наочно і мати їх як єдиний об’єкт. Також переконайтеся, що ви не переміщуєте дерева чи батьківські об'єкти, оскільки це змушує Unity відкинути кешовані перетворення та перерахувати все дерево сцен.
Якщо ваша сцена величезна, а ваш процесорний час все ще йде в Unity, проходячи по дереву сцен, щоб скласти списки для відображення всіх об'єктів, одне, що ви могли зробити, - це не дати Unity обробляти візуалізацію. Якщо у вас є кращий спосіб відстежувати об’єкти, що малюються, ви можете використовувати CommandBuffer.DrawMeshInstanced або Graphics.DrawMeshInstanced, щоб намалювати їх вручну. Я не буду детально розповідати про це, оскільки це набагато досконаліше і передбачає відсіч себе і чого іншого.
У разі, якщо статична або динамічна партія не працює належним чином (що ви можете побачити, перевіривши налагоджувач кадру), вам потрібно переконатися, що ви справді використовуєте спільний матеріал, і не робите копії матеріалу випадково при виклику meshRenderer.material
. Якщо ви зателефонуєте .material
, зробіть копії ваших матеріалів і розірвете пакетну групу. Використовуйте .sharedMaterial
замість цього.
Оскільки Unity 5.6, ви можете використовувати налагоджувач кадрів, щоб визначити, чому певні риски виклику не з'єднуються з попередніми викликами. Це буде дуже корисно, намагаючись зменшити недоліки вашої гри.
Крім того, як мінус, це досить нова функція в Unity і може бути трохи нестабільною. Також старі GPU або мобільні пристрої не обов'язково підтримують інстанції.