Яка перевага механізму прямого стану доступу OpenGL?


11

Я читав про OpenGL 4.5 Direct State Access (DSA) на opengl.org і не знаю, чи правильно я це розумію.

Здається, випливає, що старий спосіб є менш ефективним:

glBind(something)
glSetA(..)
glSetB(..)
glSetC(..)

ніж новий спосіб:

glSetA(something, ..)
glSetB(something, ..)
glSetC(something, ..)

З огляду на це тепер кожен glSetповинен містити glBind(something)всередині нього, і якщо OpenGL все ще є державною машиною, не може скористатися потоковими змінами, застосованими до одного something.

Будь ласка, поясніть міркування та переваги нового DSA.

Відповіді:


21

З огляду на це тепер кожен glSet повинен включати glBind (щось) всередині нього

Не зовсім. Це навпаки, як описано в кількох параграфах нижче.

Навіть якщо це було правдою, пам’ятайте, що команди GL з клієнтського додатка на GL-сервер (він же драйвер) мають багато накладних накладних витрат у порівнянні зі звичайним викликом функції. Навіть якщо ми припустимо, що функції DSA - це лише обгортка навколо існуючих функцій, це обгортки, які живуть всередині GL-сервера, і, отже, можуть мати (трохи) менше накладних витрат.

якщо OpenGL як і раніше є державною машиною, не може скористатися потоковими змінами, застосованими до одного-щось.

GPU не є державними машинами. Інтерфейс машинного стану GL - це емуляція, яка охоплює внутрішні драйвери, схожі на DSA, а не навпаки.

Видалення одного шару обгортання - шару, який вимагає надмірної кількості дзвінків на GL-сервер - явно виграш, навіть якщо невеликий.

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

Розширення DSA продовжує формулювати свою функцію з точки зору змін стану, оскільки це врешті-решт розширення до існуючого державного документа та не зовсім новий API, тому воно повинно було бути готовим підключитися до існуючої специфікації GL мова та термінологія документа. Навіть якщо ця існуюча мова дуже жахливо підходить для роботи як сучасного API графічного обладнання.

Будь ласка, поясніть міркування та переваги нового DSA.

Найбільшим міркуванням є те, що по-старому був біль. Складати бібліотеки було дуже важко разом, які можуть змінювати або покладатися на стан GL. Це ускладнило ефективне обгортання API API в об'єктно-орієнтованому або функціональному стилі завдяки глибоким кореням процесуального управління станом, що ускладнило обгортання API на різних мовах, що не належать C, а також ускладнило надання ефективних обгортків графічних пристроїв той абстрактний OpenGL від Direct3D.

По-друге, накладні витрати на API процедурного стану та машини, як описано раніше.

По-третє, функції DSA змінили семантику, де це було доцільно, від старих API, що дозволило підвищити ефективність. Речі, які раніше були змінені, були зроблені непорушними, наприклад, що видаляє багато бухгалтерського коду з GL-сервера. Дзвінки за допомогою програми можуть бути відправлені на апаратне забезпечення або перевірені раніше (або більш паралельно), коли GL-серверу не доведеться мати справу з об'єктами, що змінюються.

-

Додаткові обґрунтування та пояснення наведені в специфікації розширення EXT_direct_state_access .

-

Зміни обладнання, що стосуються дизайну API, досить численні.

Пам'ятайте, що OpenGL датується 1991 роком. Цільовим обладнанням були не графічні карти споживачів (таких не було), а великі робочі місця CAD тощо. Обладнання тієї епохи мало дуже різні показники, ніж сьогодні; багатопотоковість виявилася рідшою, шини пам'яті та процесори мали менший розрив у швидкості, а GPU зробив трохи більше, ніж трикутник із фіксованою функцією.

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

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

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

Сучасне обладнання працює ще більше від класичної моделі OpenGL. DSA - це одна невелика зміна, яка була потрібна десь 10 років тому (спочатку вона обіцялася як частина OpenGL 3.0), подібно до того, що робив D3D10. Багатьом з перерахованих вище апаратних змін потрібно набагато більше, ніж просто DSA, щоб підтримувати OpenGL актуальною, саме тому доступні ще великі розширення, які різко змінюють модель OpenGL . Тоді з'являється цілий новий API GLnext плюс D3D12, мантія, метал тощо, жоден з яких не підтримує застарілу машину абстракції.


Дякую за відповідь. Тож здається, що колись стан-машина (не DSA) був виграшним, але в якийсь момент щось змінилося, і тепер DSA вигідний. Чи можете ви пролити трохи світла на те, що змінилося?
Кромстер

@KromStern: зробив все можливе. Якщо вам потрібно більше деталей, хтось більш знаючий, ніж я, повинен буде її надати.
Шон Міддлічч

@KromStern Я бачив (з моїх обмежених досліджень історії) openGL, що рухається до меншого і менш зворотного дзвінка на сторону процесора на кадр; відображати списки (на що вони коштували), glDrawArrays (малювати в один дзвінок), VBO (завантажувати в GPU один раз), VAO (прив'язувати буфери до атрибутів один раз), рівномірний об'єкт буфера (встановлювати обмундирування за один раз). Мені більше не вистачає, я впевнений.
щурячий вирод

@ratchetfreak: досить дивно, зараз ми рухаємось іншим шляхом. Сучасні API / розширення орієнтовані на збільшення наших дзвінків на кадр, головним чином, усуваючи все те стан, яке потрібно встановити / відправити за виклик, і зробити зворотні дзвінки трохи більше, ніж "вставити команду нічиї в чергу команд" проти великої набір статичного стану та безперебійних ресурсів. Ооо, неохайний, я забув навіть згадати цю частину у своїй відповіді.
Шон Міддлічч

@SeanMiddleditch Я повинен був встановлювати дзвінки на кадр.
щурячий вирод

1

Огляд обґрунтовує це:

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

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

Люблю

oldState = glGet()
glBind()
glDoThings...
glSet(oldState)  // restore, in case anyone needs it just as they left it

Імовірно, старіші апаратні засоби можна зробити більш ефективними з явним API зміни станів; в іншому випадку це досить дивний ритуал. Це розширення передбачає (і просто подивіться на авторський список!), Що уникнення цього вибору, встановлення, відновлення танцю тепер більше приносить виграш у продуктивності на поточному апаратному забезпеченні навіть з додатковим параметром для кожного виклику.


"потрібно запитувати / приховувати / змінювати / відновлювати" - як це краще з DSA?
Кромстер

..доданий псевдокод для показу. З DSA нічого з цього не потрібно. Імовірно, сучасне обладнання не дійсно потребує стану "прив'язки", воно може просто отримати доступ до всього за потребою.
Девід ван Брінк

Ланцюг get/bind/do/setвикористовується рідко, оскільки "Отримати" дуже повільно. Зазвичай додатки так чи інакше повинні підтримувати репліку змінних, тому вона зводиться до просто bind/do. Я бачу сенс, хоча.
Кромстер

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