Warum gibt es Grafik-Frameworks wie OpenGL und DirectX, wenn Spiele Pixel direkt zeichnen könnten?

15

Spiele und andere grafikintensive Anwendungen verwenden Frameworks wie OpenGL und DirectX. Außerdem benötigen sie Funktionen wie Pixel Shader und DX12.

Aber warum brauchen wir all diese Frameworks und GPU-Funktionen, wenn wir einfach alles Pixel für Pixel zeichnen können?

Erstens müsste das Spiel so kompiliert werden, dass es pixelweise gezeichnet wird. Dies wird das Spiel wahrscheinlich ausführbar machen, aber wird es schneller sein und auf jeder 32-Bit-Farb-GPU (auch alten) funktionieren?

Ich weiß, dass die ersten 3D-Spiele Pixel für Pixel gezeichnet wurden, aber warum machen sie das jetzt nicht?

Suici Doga
quelle
Im Allgemeinen ist es effizienter und einfacher, eine Operation an vielen Dingen durchzuführen, als an allen Dingen einzeln.
Mehrdad
2
Denn jedes Spiel müsste für jede Grafikkarte neu geschrieben werden. Es sei denn, sie hätten die Grafikkarte nicht benutzt, aber dann wären sie langsam.
user253751
Ich denke, dass GPU-Unternehmen ihre eigenen DirectX-Treiber erstellen müssen
Suici Doga
"Aber warum brauchen wir all diese Frameworks und GPU-Funktionen, wenn wir einfach alles Pixel für Pixel zeichnen können?" Das ist , wie es war in guten alten Tagen getan. Wolfenstein 3D, Doom, Duke Nukem 3D, Quake und die meisten anderen Spiele der späten 90er Jahre verwendeten reines Software-Rendering (Quake bot OpenGL-Renderer als Option an).
el.pescado
1
@MatthewRock Du bist nicht hilfreich. Sie können sicherlich ein Betriebssystem mit einem Spiel in einem Docker-Container bündeln und den Container verteilen. Auf diese Weise muss der Benutzer keine Bibliotheksabhängigkeiten für seine Distribution installieren.
Navin

Antworten:

22

Geschwindigkeit ist der häufigste Grund, warum dies nicht getan wird. In der Tat können Sie tun, was Sie vorschlagen, wenn Sie Ihr eigenes Betriebssystem erstellen, das aus architektonischen Gründen nur sehr langsam sein wird. Die Annahme, dass es schneller ist, ist also ein bisschen mangelhaft. Selbst wenn es schneller wäre, wäre es weniger effizient in Bezug auf die Entwicklung (wie 1% Geschwindigkeitserhöhung für die 10-fache Arbeit).

Das Kopieren der Daten von der CPU auf die Grafikkarte ist relativ langsam. Je weniger Sie kopieren, desto schneller kann Ihre Aktualisierungsgeschwindigkeit sein. Idealerweise haben Sie also die meisten Daten auf Ihrer GPU und aktualisieren nur kleine Datenblöcke. Es gibt einen großen Unterschied zwischen dem Kopieren von mehr als 320 x 200 Pixel und 1920 x 1200 oder mehr. Die Anzahl der zu aktualisierenden Pixel wächst quadratisch, wenn die Seiten größer werden.

Beispiel: Es ist billiger, die GPU anzuweisen, das Bild um 10 Pixel nach rechts zu verschieben, als die Pixel manuell an verschiedenen Stellen in den Videospeicher zu kopieren.

Warum müssen Sie eine API durchlaufen? Einfach weil es nicht dein System ist. Das Betriebssystem kann aus Sicherheitsgründen nicht zulassen, dass Sie tun, was Sie wollen. Zweitens, weil das Betriebssystem Hardware abstrahieren muss, kommuniziert sogar das Betriebssystem mit dem Treiber über ein abstrahiertes System, eine API, wenn Sie so wollen.

Tatsächlich würde ich die Wahrscheinlichkeit, dass Ihr System schneller ist, einschätzen, wenn Sie die ganze Arbeit selbst erledigen würden, nahe Null. Es ist ein bisschen wie beim Vergleichen von C und Assembly. Natürlich können Sie Assembler schreiben, aber Compiler sind heutzutage ziemlich schlau und optimieren immer besser. Es ist schwer, manuell besser zu werden, selbst wenn Sie können, wird Ihre Produktivität den Bach runter gehen.

PS: Eine API macht es nicht unmöglich, dieses Update so durchzuführen, wie es bei alten Spielen der Fall war. Es ist einfach ineffizient, das ist alles. Nicht wegen des API Geistes, sondern weil es ineffiziente Zeit ist.

PPS: Deshalb rollen sie Vulkan aus.

joojaa
quelle
6
See the number of pixels you need to update grows exponetially when the sides grow.Quadratisch denke ich.
Cthulhu
"Das Kopieren der Daten von der CPU auf die Grafikkarte ist relativ langsam." Das ist wahr, aber irrelevant. Das Kopieren von mehr als ein paar Millionen Pixeln mit 60 fps ist auch über bescheidene PCI-E-Verbindungen problemlos möglich (dies würde nur einige hundert Megabyte pro Sekunde erfordern.)
Coxy
2
@pjc50 Das ist nicht falsch, aber auch nicht genau richtig. Eine GPU ist darauf spezialisiert, ein einzelnes Programm (normalerweise einen Shader) auf einer großen Datenmenge parallel auszuführen. Sie müssen also dieselben Vorgänge für viele Daten ausführen, um die Rechenleistung einer GPU tatsächlich zu nutzen. Wenn dies nicht der Fall ist, sollten Sie das Programm auf der CPU ausführen.
Nero
2
@ Daniel ist eine quadratische Funktion. Eine Exponentialfunktion wäre . Und Exponentialfunktionen wachsen viel schneller als quadratische Funktionen. 2 xx22x
Nero
1
Sie reden über das Kopieren und Verschieben, aber was wichtiger ist, ist die eigentliche Bilderzeugung. Sie müssen festlegen, welches Objekt an welchem ​​Punkt sichtbar sein wird, wie es beleuchtet wird, welche Auswirkungen Rauch usw. hat. Die GPUs sind in hohem Maße optimiert, um diese Vorgänge schnell und parallel auszuführen. APIs erleichtern das Ausdrücken gängiger Vorgänge.
IMil
15

Arbeiten Sie mit einer 32-Bit-Farb-GPU (auch mit älteren)?

Ein bisschen Geschichte: So wurden Spiele auf dem PC gespielt, bis Mitte der 90er Jahre grafische Beschleuniger verfügbar wurden. Es funktionierte tatsächlich auf jeder Hardware, da die Hardware nicht viel brachte.

Ein Grafikbeschleuniger ermöglicht das Zeichnen von Pixeln erheblich schneller als eine CPU, indem spezielle Hardware und Parallelität verwendet werden. Der Beschleuniger enthält eine Reihe von Prozessorkernen. Ein Desktop-PC verfügt je nach Alter über 1 bis 8 Kerne. Meine GTX970Ti-Grafikkarte hat 1664 (eintausendsechshundertvierundsechzig!) Kerne. Dies übertrifft den PC offensichtlich um ein Vielfaches.

Beschleuniger sind jedoch nicht standardisiert und enthalten oft seltsame Tricks der Computerarchitektur, um ihre Geschwindigkeit zu erreichen. Um ein Spiel zu schreiben, das nicht an eine bestimmte Marke und ein bestimmtes Modell der Karte angepasst ist, muss eine API vorhanden sein. Und dafür werden DirectX, GL und die Shader-Sprachen verwendet. Das Schreiben von Shadern kommt dem Schreiben eines Programms, das Pixel direkt zeichnet, in der Tat am nächsten - es ist lediglich so, dass auf der Karte tausend Kopien dieses Programms parallel ausgeführt werden, eine pro Pixel.

pjc50
quelle
Die APU meines Laptops hat 256 Shader-Kerne bei 686 MHz, während mein Tablet 192 hat.
Suici Doga
Hey, der Titan X hat 5760 Kerne.
Daniel
@Daniel Gibt es Spiele, bei denen der Titan X bei Ultrahoch <30fps ist. Der Titan X ist sehr leistungsstark
Suici Doga
Ummm, eines davon, vielleicht: maximumpc.com/10-most-graphically-demanding-pc-games
Daniel
@ Daniel Die Entwickler dieser Spiele müssen etwa 2-4 Titan X-Karten benötigen :)
Suici Doga
14

Nur um die Antwort von joojaa zu ergänzen, werden die Dinge immer noch pixelweise gezeichnet. Sie generieren die Pixel nur mit einem Vertex-Shader / Assembler / Rasterizer und strukturieren und beleuchten sie dann mit einem Fragment-Shader. Dies alles geschah in den 90er Jahren in Software, als Ihre Grafikkarte nicht viel mehr als ein Blitter und ein Frame Buffer war, aber es war höllisch langsam. Daher die Erfindung moderner GPUs.

Die Zeichnungsberechnung ist im Grunde die gleiche wie in den Doom-Tagen, aber jetzt läuft sie auf Hunderten / Tausenden von Shader-ALUs anstatt auf einer Handvoll CPU-Kernen. Die APIs sind im Grunde genommen denselben GPU-Anweisungen hinter den Kulissen zugeordnet. Sie sind nur da, um zu verhindern, dass Sie unzählige GPU-Baugruppen über mehrere Anbieterplattformen hinweg schreiben müssen.

russ
quelle