Найкраща практика встановлення параметрів ефекту в XNA


13

Я хочу запитати, чи є найкраща практика встановлення Effectпараметрів у XNA. Або іншими словами, що саме відбувається, коли я телефоную pass.Apply(). Я можу уявити кілька сценаріїв:

  1. Кожен раз, коли Applyвикликається, всі параметри ефекту передаються в GPU, і це не має реального впливу на те, як часто я встановлюю параметр.
  2. Кожен раз, коли Applyвикликається, передаються лише параметри, які були скинуті. Тому слід уникати кешування операцій Set, які фактично не встановлюють нове значення.
  3. Кожен раз, коли Applyвикликається, передаються лише зміни, які були змінені. Тож кешування операцій Set не є марним.
  4. Це ціле запитання беззаперечне, тому що жоден із згаданих способів не має помітного впливу на продуктивність гри.

Отже, остаточне запитання: чи корисно реалізувати кешування керованої операції типу:

private Matrix _world;
public Matrix World
{
    get{ return _world; }
    set 
    {
        if (value == world) return;
        _effect.Parameters["xWorld"].SetValue(value);
        _world = value;
    }
}

Дякую вам в очікуванні.


Я додав тег DirectX, виходячи з того, що це функціонал нижчого рівня, ніж XNA.
Ендрю Рассел

Я знайшов доказ того, що ця тема дуже ДУЖЕ життєздатна. Схоже, якщо ви розумні в налаштуванні параметрів ефекту, ви можете збільшити кількість дзвінків на зворотній зв'язок (тобто, наскільки швидко вони обробляються на процесорі) більш ніж удвічі. Я все ще в процесі тестування цього, ви можете прочитати моє запитання тут: gamedev.stackexchange.com/questions/66932 / ...
cubrman

Відповіді:


8

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

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

(Оскільки сценарій №2 - це можливість, можливо, краще не обмінюватися навмисно перевстановлюючими параметрами, які не змінюються.)

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

Звичайно, не починайте впроваджувати такі оптимізації, не вимірюючи ефективність та розуміючи, що відбувається.

Крім того , порівнюючи Matrixз ==поганої вуду. A Matrixскладається з floats, а порівняння рівності з плаваючою комою у багатьох випадках схильне до відмови.

І, взагалі кажучи, закономірність if(x != y) x = y;відбувається повільніше, ніж просто x = y.


Цікавий момент, що водій повинен дбати про це. Дякуємо за посилання (і повторні посилання).
0xBADF00D

Нещодавно я натрапив на приклад примірника геометрії з msdn . Скидання одних і тих же рендеролів (з однаковими значеннями) кілька разів на кадр значно уповільнює процес візуалізації в два-три рази. Таким чином, дозування стану є корисною. На жаль, я не впевнений, що ця ситуація стосується і встановлення параметрів ефекту. Але я хотів би поділитися своєю інформацією.
0xBADF00D

4

Одну цікаву річ я знайшов у цій темі.

Від msdn:

Ви можете використовувати властивість індексованих параметрів на Effect для доступу до будь-якого параметра ефекту, але це повільніше, ніж використання EffectParameters. З цієї причини слід створити параметр EffectParameter для кожного параметра ефекту, який часто змінюється.

і

Створення та призначення примірника EffectParameter для кожної техніки у вашому Effect значно швидше, ніж використання властивості, індексованої параметрами на Effect.

Це означає, що _effect.Parameters["xWorld"].SetValue(value);помітно повільніше, ніжwordlParam.SetValue(value);

Тому, ймовірно, слід кешувати такі параметри кешування:

public EffectParameter wordlParam;
wordlParam = _effect.Parameters["xWorld"];

Але фактичних орієнтирів я не знайшов.

Джерела:

http://msdn.microsoft.com/en-us/library/Microsoft.Xna.Framework.Graphics.EffectParameter%28v=xnagamestudio.40%29.aspx http://msdn.microsoft.com/en-us/library /bb976060%28v=xnagamestudio.31%29.aspx


Щойно перевірив це на емуляторі Monogame та WP - я можу підтвердити, що дійсно є значна різниця (в моєму випадку між 5-15%). Чи є ще такі хитрощі, які допомагають у виконанні?
Конрад
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.