Welchen Vorteil haben OpenGL, SFML und SDL gegenüber Software-Rendering?

24

Ich habe angefangen, den Stream Handmade Hero zu sehen , in dem Casey Muratori eine Game-Engine erstellt, ohne Frameworks oder ähnliches zu verwenden. Gestern bin ich zu dem Teil gekommen, wo er gezeigt hat, wie ein Bild auf den Bildschirm gezeichnet wird. Soweit ich es verstanden habe, hat er nur einen Speicher zugewiesen, der so groß ist wie der Bildschirm, auf den er zeichnen möchte. Dann erstellte er eine Bitmap, die er an den von ihm zugewiesenen Pufferspeicher weitergab und mit einer os-spezifischen Funktion auf den Bildschirm zog.

Das scheint ganz einfach zu sein. Ich habe GameMaker verwendet, zu Love2D gewechselt, ein bisschen mit Sprite Kit gearbeitet, aber ich habe mich immer gefragt, was wirklich unter diesen manchmal verwirrenden Ebenen passiert.

Warum sollten Sie sich überhaupt die Mühe machen, Grafikbibliotheken (OpenGL, SFML, SDL usw.) zu verwenden, wenn Sie lediglich einen Puffer zuweisen, eine Bitmap übergeben und auf den Bildschirm zeichnen müssen?

Wenn Sie dann verschiedene Dinge auf Ihren Bildschirm zeichnen möchten, schreiben Sie sie einfach in Ihre Bitmap, die dann in den Puffer übertragen wird. Ich bin ziemlich neu in der Programmierung, aber das scheint mir ziemlich einfach zu sein. Bitte korrigieren Sie mich, falls ich falsch liege.

user148013
quelle
11
Später in seiner Serie (um Episode 220) wird er OpenGL verwenden. Der Grund, warum er das tut, ist Geschwindigkeit.
Ratschenfreak
5
Der Trick besteht darin, zu bestimmen, was auf dem Bildschirm gezeichnet werden soll. Alle GPU-Texturen / Schattierungen, Dreiecke, Kameraprojektionen usw. müssen zuerst ausgeführt werden, um zu entscheiden, welche Farbe jedes Pixel haben soll. Das Schieben der Pixelfarben auf den Bildschirm ist der einfache Teil.
user14146
2
SDL und OpenGL schließen sich nicht gegenseitig aus. SDL ist eine "Hardwareabstraktionsschicht", die auch Fenster, Ereignisse und Eingaben verarbeitet, anstatt nur eine Grafikbibliothek zu sein. SDL kann auch in Verbindung mit OpenGL verwendet werden, damit SDL alle nicht grafischen Aufgaben erledigen kann, während OpenGL die Grafiken verarbeitet. Beachten Sie auch, dass OpenGL in den meisten Fällen direkt mit der GPU zusammenarbeitet, während SDL je nach Version und System, für das kompiliert wird, möglicherweise nicht funktioniert.
Pharap
SFML verwendet OpenGL zum Rendern, sodass SFML eigentlich nur eine einfachere Oberfläche für die Verwendung von OpenGL bietet.
Cornstalks
2
Techcnailyl, was Casey tut, verwendet immer noch eine Grafikbibliothek. Die Bibliothek heißt GDI , und obwohl sie Teil der Haupt-API des Betriebssystems ist, ist sie technisch immer noch eine Grafikbibliothek.
Pharap

Antworten:

41

Es geht nicht nur um die Geschwindigkeit der Ausführung, sondern auch um die Einfachheit. Obwohl das in diesem Beispiel verwendete Software-Rendering viel langsamer ist als das Verwenden der Hardwarebeschleunigung (dh einer GPU), ist das Zeichnen einiger Bitmaps auf dem Bildschirm eine so einfache Aufgabe, dass Sie den Leistungsabfall nicht bemerken.

Aktivitäten auf niedriger Ebene wie Dreiecksrasterung, Tiefensortierung und dergleichen sind jedoch allgemein bekannte Konzepte, die die GPU mit wenigen Befehlen implizit verarbeiten kann. Die Neuimplementierung im Softwaremodus erfindet das Rad grundlegend neu. Dies ist in Ordnung, wenn Sie ein grundlegendes Verständnis für das Rendern erlangen möchten. Ich selbst habe einen 3D-Software-Renderer geschrieben, um es ein wenig zu untersuchen. In den meisten Fällen ist es jedoch Zeitverschwendung, wenn OpenGL es schneller erledigt die Kiste.

Das Beispiel, das Sie angegeben haben, klingt äußerst einfach: Es wird nur ein einzelnes Bild auf den Bildschirm gezeichnet, daher ist die Implementierung einfach. Sobald Sie jedoch anfangen, die Komplexität zu überlagern, wird es immer komplizierter, alles richtig zu rendern. Die Dinge, die die Leute in den Quake-Tagen des Renderns von 3D-Software zu tun hatten, waren verrückt, obwohl ich es zu schätzen weiß, dass Sie (noch) nicht so weit kommen.

Richard Greenlees
quelle
12
OpenGL kennt Begriffe wie Punkte, Linien und Dreiecke. Meistens arbeiten Sie mit Dreiecken. Um zu lernen, wie man mit OpenGL arbeitet, kann ich opengl-tutorial.org empfehlen . Um zu erfahren, was OpenGL unter der Haube tut , werfen Sie einen Blick in das offizielle Wiki: opengl.org/wiki/Rendering_Pipeline_Overview
tkausl
1
Ich wollte +1 geben, aber ich mag es nicht, das Rad neu zu erfinden, weil ich das Gefühl habe, dass es einen falschen Eindruck in Bezug auf die Geschichte des Rechnens vermittelt. Das Rendern von Bitmaps stand an erster Stelle, daher war OpenGL die "Neuerfindung des Rads". Sie hatten jedoch zwei gute Gründe: 1) Standardisierung und 2) GPU-Beschleunigung. Das Rad neu zu erfinden ist nicht immer eine schlechte Sache, wenn die neue Version eine Verbesserung darstellt (dh Räder mit Reifen gegen hölzerne Wagenräder). Der entscheidende Punkt dabei sollte nicht sein, dass Software-Rendering das Rad neu erfindet, sondern dass es dem GPU-Rendering unterlegen ist.
Pharap
4
@Pharap mit der Ausnahme, dass das Schreiben eines Software-Renderers das Rad jetzt absolut neu erfindet, unabhängig davon, ob es historisch war oder nicht.
porglezomp
1
Dies ist nur eine halbe Antwort. Die nächste Antwort ist die andere Hälfte, aber eine vollständige Antwort (einschließlich einer kurzen Erklärung des Unterschieds zwischen OpenGL und den anderen Dingen, die er erwähnt) wäre die richtige Antwort auf diese Frage.
Jasper
1
@ user148013 "Kennt opengl Begriffe wie Punkt, Linie, Dreieck?" Modernes OpenGL befasst sich ausschließlich mit diesen Primitiven. Sie können nur sie rastern.
Nax 'vi-vim-nvim',
25

Meine Frage ist: Warum sollte man sich überhaupt die Mühe machen, etwas wie open gl, sfml, sdl zu verwenden, wenn man nur einen Puffer zuweist, eine Bitmap übergibt und auf den Bildschirm zeichnet?

Kurz: Weil es schnell ist (OpenGL, DirectX).

Lange:

Sie können denken, Sie können dies alles selbst tun. Zeichnen Sie Pixel auf einen Bildschirm. Sie können eine kleine Bibliothek schreiben, um Formen wie Quadrate oder Dreiecke zu zeichnen. Das wird natürlich funktionieren. Es gibt viele Bibliotheken, die genau das tun. Einige von ihnen implementieren sogar die OpenGL-Spezifikation (sozusagen eine Softwareseite für OpenGL), die genau das tut, was Casey Muratori tut. Sie berechnen alles auf der Softwareseite, setzen die Pixel auf der Softwareseite und schreiben das Ergebnis auf den Bildschirm.

Dies ist jedoch langsam . Die CPU, die letztendlich all diese Dinge ausführen wird, wurde für dieses Szenario nicht erstellt. Dafür sind GPUs da. Was OpenGL macht (es sei denn, es ist eine Software-Implementierung), ist, alles zu nehmen, was Sie sagen, und alle Daten, alle Draw-Calls, fast alles auf die Grafikkarte zu übertragen und die GPU zu beauftragen, die Arbeit zu erledigen. Die GPU ist speziell für diese Art von Arbeit gemacht. Multiplizieren von Gleitkommazahlen (das ist, was Sie viel tun, wenn Sie eine 3D-Szene zeichnen) und Ausführen von Shadern. Und das parallel. Um Ihnen ein Gefühl dafür zu geben, wie schnell die GPU ist, stellen Sie sich eine einfache 3D-Szene im Vollbildmodus mit 1920 x 1080 Pixeln vor. Dies sind multipliziert 2.073.600 zu zeichnende Pixel. Für jeden EinzelnenPixel, die GPU wird den Fragment-Shader ausführenmindestens einmal , meistens mehr als einmal. Nehmen wir an, wir laufen mit 60 Bildern pro Sekunde. Dies bedeutet, dass die GPU den Fragment-Shader 2.073.600 * 60 = 124.416.000 Mal pro Sekunde ausführt . Glaubst du, du kannst so etwas auf deiner CPU machen? (Das ist eine ziemlich vereinfachte Erklärung. Es gibt noch viel mehr Dinge zu überlegen, wie viele Pixel Sie mit näheren Objekten überzeichnen, wie viel MSAA Sie verwenden und so weiter. Die 124.416.000 Mal pro Sekunde sind jedoch wahrscheinlich die niedrigsten, die Sie erhalten können, und Sie werde mit einer einfachen Szene leicht viel mehr als 60fps haben)

Das ist, was OpenGL und Direct3D tun, für welche Engines @Uri Popovs Antwort sehen.

tkausl
quelle
8
Er erschafft ein 2D-Spiel, das ist ein anderes Thema als 3D. Und wenn ich langsam sage , bedeutet das nicht unbedingt, dass es weniger als 60 fps hat, aber es bedeutet, dass die Grafikkarte den gleichen Job in einem Bruchteil der Zeit erledigt, die die CPU benötigt, zumindest wenn es um 3D-Raum geht.
tkausl
4
Der Grund, warum GPUs besser darin sind, ist, dass sie so eingerichtet sind, dass sie die Shader-Aufrufe parallelisieren.
Ratschenfreak
4
@ user148013 Von dem, was ich von diesem Typen gesehen habe, würde ich sagen, dass er genau das Gegenteil von "sehr weise" ist.
Bartek Banachewicz
4
Es ist nicht nur langsamer zu rendern (Caseys Software-Renderer war überraschend schnell). Es ist auch eine Menge Daten, die vom allgemeinen RAM zum Video-RAM übertragen werden müssen. Das Verschieben einer riesigen Bitmap auf die Grafikkarte kann je nach Bustyp einen erheblichen Teil der Bildzeit in Anspruch nehmen. Mit der GPU verschieben Sie Texturen gelegentlich und verwenden sie Frame für Frame.
Adrian McCarthy
2
@ user148013 Es gibt einen Unterschied zwischen auffälliger und guter Programmierung. Sie können sich überlappen, befinden sich jedoch häufig in einem Konflikt. Ich würde "Ich kann in Software rendern [genau wie MESA ...]" unter " auffällig" setzen und mit Sicherheit nicht gut .
11

Was er tut, heißt Software-Rendering , was OpenGL tut, heißt GPU-Rendering

Was ist der Unterschied zwischen ihnen? Geschwindigkeit und Gedächtnis.

Die Rasterung (Ausfüllen von Dreiecken auf dem Bildschirm) dauert einige Zeit. Wenn Sie dies auf der CPU tun, nehmen Sie sich im Wesentlichen die Zeit für die Spielelogik, insbesondere wenn diese nicht gut optimiert ist.

Und egal, wie klein das Bild ist, er muss eine bestimmte Menge an Speicher dafür reservieren. GPUs haben dafür einen Videospeicher.

Bálint
quelle
Ist Software-Rendering auch unter OS X möglich? Weil anscheinend alles, was mit Grafik zu tun hat, von OpenGl jetzt Metal gemacht wurde.
user148013
2
@ user148013 Sie haben einige Missverständnisse. OpenGL ist eine plattformübergreifende API und kann daher unter OS X ausgeführt werden. Tatsächlich kann OpenGL auf allen Computern mit einer "modernen" (nach 2000) GPU ausgeführt werden. Metal ist eine separate API nur für Apple-Geräte. Software-Rendering ist auch eine von beiden getrennte Sache, und ja, es kann auch unter OS X durchgeführt werden. Grundsätzlich werden die Pixel auf dem Bildschirm nur manuell mit der CPU eingestellt.
Bálint
Genau deshalb habe ich gefragt, weil meines Wissens Software-Rendering unter OS X nicht möglich ist. Cocoa greift auf OpenGl zu, Quarz verwendet OpenGl, Core Framework verwendet OpenGl. Sie alle nutzen jetzt Metal, um schneller voranzukommen. Aber ich habe keine einzige Funktion gefunden, die ohne die Verwendung der GPU (OpenGl, Metal) einen Puffer auf den Bildschirm zeichnet.
user148013
1
@ user148013 Da dies weder für ein Betriebssystem noch für Implementierungen spezifisch ist. Angenommen, Sie möchten es in Java implementieren, da dies eine berühmte Wahl für die Entwicklung auf mehreren Plattformen ist. Mit Java können Sie dies tun, indem Sie zuerst ein Fenster (JFrame) erstellen. Anstatt direkt darauf zu zeichnen, zeichnen Sie auf ein Bild und platzieren dieses Bild dann auf dem Rahmen. Es wird jedoch die Begriffe "Dreieck" oder "Linie" nicht kennen. Nur Farben. Sie müssen dies selbst mit einem Rasterungsalgorithmus implementieren. Aus diesem Grund bevorzugen wir OpenGL, es ist schneller und ein bisschen einfacher zu bedienen. Grundsätzlich handelt es sich um eine Rasterisierungs-API.
Bálint
2
@ user148013 Warum konnten sie nicht? Wenn sie ein Fenster öffnen und 1 Bild ohne API darauf zeichnen können, können sie es.
Bálint,
8

Während die Antworten von anderen korrekter sind als jede andere Antwort, möchte ich auf das grundsätzliche Missverständnis hinweisen, wie Softwareentwicklung funktioniert, von dem ich denke, dass es Ihrer Frage zugrunde liegt. Obwohl es immer möglich ist, Dinge "selbst" ohne ein Framework zu tun, und dies oftmals einen großen pädagogischen Vorteil mit sich bringt, ist es in der Realität nicht so, wie moderne Software erstellt wird.

Jemand hat die Hardware und die Maschinensprachen erstellt, die darauf ausgeführt werden. Jemand anderes erstellt höhere Sprachen und Compiler, Treiber und Betriebssysteme, Grafikbibliotheken und so weiter. Wir alle bauen auf der Arbeit unserer Vorgänger auf. Das ist nicht nur "okay", es ist eine Voraussetzung.

Sie zeichnen die Linie dessen, was "akzeptabel" ist oder nicht, an einem beliebigen Punkt in der Toolchain. Sie könnten genauso leicht sagen: "Warum sollten Sie C ++ verwenden, wenn Sie dasselbe in der Montage tun könnten?" Es gibt nicht genug Stunden am Tag oder Jahre im Leben, damit jeder alles selbst machen kann.

Dies gilt nicht nur für die Softwareentwicklung, sondern für das moderne Leben im Allgemeinen. Haben Sie jemals von dem Typ gehört, der selbst einen Toaster gebaut hat? http://www.thomasthwaites.com/the-toaster-project/ . Es hat sehr viel Zeit und Mühe gekostet. Für einen Toaster. Versuchen Sie, alles , was Sie brauchen, um ein Videospiel zu verwirklichen, selbst zu erstellen!

erich8
quelle
2
Ich denke, dies ist eine gute Antwort, da darin angegeben ist, warum die Verwendung von Frameworks gut ist, ohne die Idee einer Neuerfindung des Rads für Bildungszwecke herabzusetzen.
Pharap
3

Motoren leisten viel mehr, als nur ein Bild auf den Bildschirm zu zeichnen. Sie kümmern sich um Beleuchtung, Schatten, Eingabe und Kollisionserkennung. Selbst der Rendering-Teil ist weitaus komplexer als nur ein Puffer auf den Bildschirm zu schieben. Insbesondere für 3D-Szenen müssen Sie eine Menge Berechnungen mit weitaus komplexeren Daten als einer Bitmap durchführen. Lassen Sie mich eine Analogie zu einem Auto geben: Was Sie als einfach bezeichnen, ist der Auspuff des Autos. Sie machen einfach eine Pfeife mit der richtigen Größe und schieben dann das Gas von einem Ende zum anderen. Dies ist jedoch bei weitem nicht das Einzige, was im Mechanismus des Autos passiert.

Uri Popov
quelle
3

Die obigen Antworten sind ausgezeichnet, aber keiner geht wirklich über den wichtigsten Grund, warum OpenGL und dergleichen bevorzugt werden. Der Hauptgrund ist die Verwendung dedizierter Hardware, die speziell für das Rendern von Millionen von Pixeln auf einem Bildschirm, der GPU, entwickelt wurde .

Beim Software-Rendering unter Verwendung der CPU durchläuft der Renderer nacheinander alle Pixel auf einer Bitmap und gibt Befehle aus, die jeweils auf dem Bildschirm angezeigt werden. Wenn Sie also ein Image in der Größe 1000x1000 rendern, werden 1.000.000 Loops für Ihre CPU ausgeführt. Sie sind schließlich auf Kontrolle ausgelegt; viele if-Bedingungen, Springen von einem Befehlssatz zum nächsten und eine strikte Richtung des Kontrollflusses. Eine GPU ist jedoch so konzipiert, dass sie genau weiß, was sie tun wird eine Menge ähnlicher Schleifen über Pixel auf dem Bildschirm ausführt.Eine GPU nimmt eine for-Schleife mit 1000000 Iterationen und teilt die Arbeit auf die große Anzahl von Kernen auf, damit jede parallel und unabhängig voneinander arbeitet. Im Gegensatz zur CPU verarbeitet eine GPU jedes Mal, wenn sie auf eine if-else-Bedingung stößt, beide Codezweige zu zwei Kernen von sich selbst, UND DANN wird ganz am Ende geprüft, wie die Bedingung ausgewertet und verworfen wird Ergebnis der nicht benötigten Verzweigung (daher werden viele If-else-Bedingungen in GPU-Shadern missbilligt; sie sind immer für eine Verschwendung verantwortlich).

Also ja, GPUs basieren auf Parallelität . Das macht das Arbeiten mit Pixeln für sie im Vergleich zu CPUs viel schneller.

Aiman ​​Al-Eryani
quelle
0

Siehe Muss ich wirklich eine Grafik-API verwenden?

Sicher, Sie können nach einem Puffer fragen, einige Bits darin setzen und ihn auf den Bildschirm schreiben. Dies war im Wesentlichen die einzige Möglichkeit, die Grafikprogrammierung auf dem PC durchzuführen, bis Mitte der 90er-Jahre Grafikbeschleuniger von 3DFX zur Verfügung standen. Selbst unter Windows wurde DirectX entwickelt, um direkten Zugriff auf den Videospeicher zu ermöglichen.

Auf Nicht-PC-Hardware, dedizierten Spielautomaten, gab es jedoch schon immer Techniken zur Beschleunigung der Grafik, indem die Arbeit vom Prozessor abgeladen wurde. Sogar der Atari 2600 hatte "Hardware-Sprites", zum Teil, weil er nicht genug RAM für einen Framebuffer hatte.

Später (Mitte der 80er Jahre) wurden Spielekonsolen für Plattformspiele optimiert. Wieder kein Framebuffer; Stattdessen kann der Programmierer Raster von Kacheln angeben :

Die Genesis-Grafikhardware besteht aus 2 scrollbaren Ebenen. Jedes Flugzeug besteht aus Kacheln. Jede Kachel ist ein 8 x 8 Pixel großes Quadrat mit 4 Bits pro Pixel. Jedes Pixel kann somit 16 Farben haben. Jede Kachel kann 1 von 4 Farbtabellen verwenden, sodass Sie auf dem Bildschirm 64 Farben gleichzeitig erhalten können, jedoch nur 16 in einer bestimmten Kachel. Kacheln benötigen 32 Bytes. Es gibt 64 KB Grafikspeicher. Dies würde 2048 eindeutige Kacheln ermöglichen, wenn der Speicher für nichts anderes verwendet würde.

pjc50
quelle
-2

Moderne CPUs sind schnell genug, um 2d-Spiele in Software zu erstellen. Für 2d-Grafiken bietet OpenGL / DirectX also keine Vorteile, außer dass Sie Ihrem Projekt noch eine weitere Abhängigkeit und Komplexität hinzufügen, z. B. das Festlegen einer 3D-Projektionsmatrix zum Zeichnen einer Gruppe von Sprites und Hochladen von Daten auf die GPU.

OpenGL würde Sie auch dazu zwingen, alle Ihre Sprites in 512x512-Texturen zu packen (ein Artefakt alter Konsolen wie PSX, das Grafiken in Videospeicherseiten packt), und Sie müssten ziemlich komplexen Sprite-Packcode schreiben.

Wenn Sie dagegen 3D ausführen und Millionen von Dreiecken mit komplexer Schattierung rendern, ist eine GPU unvermeidlich. Vor langer Zeit gab es eine einfachere Nur-2d-Version von Direct3d namens DirectDraw, die das Sprite-Zeichnen mit der GPU beschleunigte. Jetzt unterstützt Microsoft sie jedoch nicht mehr .

SmugLispWeenie
quelle