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?
3d
gpu
performance
pixel-shader
pixels
Suici Doga
quelle
quelle
Antworten:
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.
quelle
See the number of pixels you need to update grows exponetially when the sides grow.
Quadratisch denke ich.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.
quelle
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.
quelle