Практична вартість ефектів заміни


16

Я використовую XNA для своїх проектів, і на цих форумах я іноді бачу посилання на той факт, що заміна ефекту на сітку має відносно високу вартість, що мене дивує, оскільки я думав, що поміняти ефект просто випадок копіювання програми заміни шейдера до GPU разом з відповідними параметрами.

Мені було цікаво, чи хтось може пояснити, що саме коштує цього процесу? І ставити, якщо можливо, "відносно" в контекст?

Наприклад, скажіть, що я хотів використати короткий шейдер, щоб допомогти з вибором, я б:

  1. Змініть вплив на кожен об’єкт, обчисливши унікальний колір, щоб його ідентифікувати та надавши шейдеру.
  2. Намалюйте всі об'єкти до цілі візуалізації в пам'яті.
  3. Отримайте колір від цілі та використовуйте його для пошуку обраного об’єкта.

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

Відповіді:


21

Проблема, яку ви описуєте, не є «особливою» проблемою. Нічого особливо повільного в зміні ефектів на GPU. Проблема зі зміною ефектів, параметрів ефекту (включаючи перетворення), текстур, різних станів візуалізації та простої відправки декількох команд малювання полягає в тому, що це вимагає, щоб інша партія повинна бути відправлена ​​в GPU .

Пакети пов'язані з процесором, і ви отримуєте лише кілька тисяч * за кадр .

Це залежить від процесора і якої іншої роботи ви займаєтесь, але скажімо, ви отримуєте близько 1000 партій за кадр. Якщо ви рендеруєте один об'єкт за партію, перед тим, як виникнути проблеми, ви можете намалювати близько 1000 об'єктів на екрані.

Якщо ви раптом додаєте збирання, і вам доведеться рендерувати всі свої об’єкти двічі, то ви обмежуєтеся малювати лише 500 об’єктів.

(Тож якщо у вас є лише невелика кількість об'єктів, тоді не турбуйтеся про це!)

Щоб зменшити кількість партій, які ви використовуєте, вам, в основному, потрібно "бути розумними" щодо цього. Прототиповим методом для цього є вміле поєднання декількох об'єктів в одну партію. Зокрема, шукайте " інстанції ". Можливо, ви можете використовувати номер екземпляра, щоб призначити унікальний колір кожному об'єкту у вашому шейдері.

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

Ось цілий слайд презентації від NVidia під назвою "Batch, Batch, Batch: Що це насправді означає?" (PDF), який має хороші графіки та матеріали, що пояснюють це. Тут також перелічено деякі методи зменшення кількості партій.


Домовились! Дякую за пояснення та пропозиції, те, що я читаю, зараз має багато сенсу. Дякую також за презентацію NVidia, я просто читаю її зараз і дуже корисно.
sebf

1
Оновлене посилання на папір "Пакет, Пакет, Пакет": ce.u-sys.org/Veranstaltungen/…
Marton

1
Дякую Мартоне, я відредагував нове посилання на пост :)
Ендрю Рассел
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.