So wie es jetzt aussieht, muss jedes glSet glBind (etwas) enthalten
Nicht genau. Es ist umgekehrt, wie in den folgenden Abschnitten beschrieben.
Denken Sie auch dann daran, dass GL-Befehle von der Client-App an den GL-Server (auch als Treiber bezeichnet) im Vergleich zu einem regulären Funktionsaufruf einen hohen Versandaufwand haben. Selbst wenn wir davon ausgehen, dass die DSA-Funktionen nur Wrapper um vorhandene Funktionen sind, handelt es sich um Wrapper, die sich im GL-Server befinden und daher (etwas) weniger Overhead haben können.
Wenn OpenGL immer noch eine Zustandsmaschine ist, können gestreamte Änderungen, die auf ein einzelnes Objekt angewendet werden, nicht genutzt werden.
GPUs sind keine Zustandsautomaten. Die GL-Zustandsmaschinenschnittstelle ist eine Emulation, die DSA-ähnliche Treiberinternale umschließt, nicht umgekehrt.
Das Entfernen einer Wrapping-Schicht - eine Schicht, die eine übermäßige Anzahl von Anrufen auf dem GL-Server erfordert - ist eindeutig ein Gewinn, auch wenn es sich um eine kleine handelt.
Der State-Machine-Ansatz macht auch beim Umgang mit mehreren Threads nicht viel Sinn. GL ist in diesem Anwendungsfall immer noch schrecklich, aber Treiber verwenden häufig Threads hinter den Kulissen, und eine Zustandsmaschine erfordert viel Thread-Synchronisation oder wirklich ausgefallene parallele Algorithmen / Konstrukte, damit die Dinge zuverlässig funktionieren.
Die DSA-Erweiterung formuliert ihre Funktionsweise weiterhin in Bezug auf Statusänderungen, da es sich schließlich um eine Erweiterung eines vorhandenen zustandsbasierten Dokuments und nicht um eine völlig neue API handelt. Daher musste sie bereit sein, sich in die vorhandene GL-Spezifikation einzufügen Sprache und Terminologie des Dokuments. Auch wenn diese vorhandene Sprache für ihre Aufgabe als moderne Grafikhardware-API ziemlich gut geeignet ist.
Bitte erläutern Sie die Gründe und Vorteile des neuen DSA.
Der größte Grund ist, dass der alte Weg ein Schmerz war. Es machte es sehr schwierig, Bibliotheken zusammenzustellen, die jeweils den GL-Status ändern oder sich darauf verlassen könnten. Es machte es schwierig, die GL-API in einem objektorientierten oder funktionalen Stil effizient zu verpacken, da die Wurzeln des prozeduralen Statusmanagements tief verwurzelt waren, was das Verpacken der API in verschiedene Nicht-C-Sprachen schwierig machte und es auch schwierig machte, effiziente Wrapper für Grafikgeräte bereitzustellen diese abstrakte OpenGL von Direct3D.
Zweitens war der prozedurale State-Machine-API-Overhead, wie zuvor beschrieben.
Drittens haben die DSA-Funktionen die Semantik gegebenenfalls gegenüber den alten APIs geändert, die eine verbesserte Effizienz ermöglichten. Dinge, die zuvor veränderlich waren, wurden zum Beispiel unveränderlich gemacht, wodurch viel Buchhaltungscode vom GL-Server entfernt wurde. Anrufe von der Anwendung können an die Hardware gesendet oder früher (oder paralleler) validiert werden, wenn der GL-Server nicht mit veränderlichen Objekten umgehen muss.
- -
Zusätzliche Begründungen und Erläuterungen finden Sie in der Erweiterungsspezifikation EXT_direct_state_access .
- -
Hardwareänderungen, die für das API-Design relevant sind, sind ziemlich zahlreich.
Denken Sie daran, dass OpenGL aus dem Jahr 1991 stammt. Die Zielhardware waren keine Consumer-Grafikkarten (diese gab es nicht), sondern große CAD-Workstations und dergleichen. Die Hardware dieser Ära hatte ganz andere Leistungsbereiche als heute; Multithreading war seltener, Speicherbusse und CPUs hatten eine geringere Geschwindigkeitslücke, und die GPU leistete kaum mehr als das Rendern von Dreiecken mit festen Funktionen.
Es wurden immer mehr Funktionen mit festen Funktionen hinzugefügt. Es wurden verschiedene Beleuchtungsmodelle, Texturmodi usw. hinzugefügt, von denen jedes seinen eigenen Zustand benötigt. Der einfache staatsbasierte Ansatz funktionierte, wenn Sie eine Handvoll Staaten hatten. Als immer mehr Zustände hinzugefügt wurden, begann die API aus allen Nähten zu platzen. Die API wurde umständlicher, weicht jedoch nicht zu weit von den Hardwaremodi ab, da sie tatsächlich auf vielen Statuswechseln basieren.
Dann kam programmierbare Hardware. Die Hardware ist immer programmierbarer geworden, bis zu dem Punkt, an dem die Hardware jetzt einen kleinen Status, einige vom Benutzer bereitgestellte Programme und viele Puffer unterstützt. All dieser Zustand aus der vorherigen Ära musste emuliert werden, genauso wie alle Funktionen mit festen Funktionen dieser Ära von den Fahrern emuliert wurden.
Auch die Hardware wurde immer paralleler. Dies erforderte andere Hardware-Redesigns, die Änderungen des Grafikstatus sehr teuer machten. Die Hardware arbeitet in großen Blöcken mit unveränderlichem Zustand. Aufgrund dieser Änderungen konnte der Treiber nicht einfach jedes kleine Stück des vom Benutzer sofort festgelegten Status anwenden, sondern musste die Änderungen automatisch stapeln und bei Bedarf implizit anwenden.
Moderne Hardware arbeitet noch weiter vom klassischen OpenGL-Modell entfernt. DSA ist eine kleine Änderung, die vor mehr als 10 Jahren benötigt wurde (ursprünglich als Teil von OpenGL 3.0 versprochen), ähnlich wie D3D10. Viele der oben genannten Hardwareänderungen erfordern weit mehr als nur DSA, um OpenGL relevant zu halten, weshalb noch mehr große Erweiterungen verfügbar sind, die das OpenGL-Modell drastisch ändern . Dann gibt es die ganz neue GLnext-API plus D3D12, Mantle, Metal usw., von denen keine die veraltete Abstraktion der Zustandsmaschine beibehält.