Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Beiträge: 1 223

Wohnort: Deutschland Bayern

Beruf: Schüler

  • Private Nachricht senden

51

08.04.2015, 00:17

Die Sache ist, dass zur Zeit das Teuere am Draw Befehl nicht das tatsächliche Zeichnen ist, sondern eben die Vorbereitung.

Wenn es anders wäre, würde keiner empfehlen, die selbe Zeichenarbeit in so wenig Draw Calls wie möglich zu packen.

David_pb

Community-Fossil

  • »David_pb« ist der Autor dieses Themas

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

52

08.04.2015, 09:21

Danke für den Link! :) Zu Tobiking und Spiele Programmierers Antwort sei noch hinzugefügt:

Kann mir bitte jmnd. erklären warum die neuen API-Architekturen/Varianten schneller sind? Was ist überhaupt mit "Overhead" gemeint bzw. was bedeutet das eig.?


Vereinfacht ausgedrückt läuft die Kommunikation von Anwendung und Grafikkarte asynchron, über einen (sog) Commandbuffer. Die Anwendung erzeugt eine Sequenz von Kommandos (z.B. Setze Rendertargets, binde Shader, binde Ressources [Texturen, Index/Vertexpuffer, ...] und zeichne mir ein Mesh mit den Parametern XYZ). Diese Kommandos werden nicht direkt von der GPU ausgeführt, sondern erstmal in einem Puffer gemerkt. Irgendwann später wird der Puffer zum verarbeiten an die GPU weitergegeben und die GPU verarbeitet alle Kommandos, der Reihe nach, bis der Commandbuffer leer ist. In der Zwischenzeit kann die CPU schon weitere Puffer zusammenstellen. Das heißt quasi, die GPU kann durchaus mehrere Frames hinter der CPU laufen.

Das Zusammenstellen der Kommandos im Commandbuffer benötigt natürlich CPU-Leistung. Im Idealfall ist der CPU Part so klein, das die Anwendung der GPU genug Futter liefert um nicht zu verhungern, neben allen anderen Aufgaben, die die CPU noch zu erledigen hat. Wenn die CPU allerdings zu wenig Arbeit bereitstellen kann, dann sitzt die GPU nur rum und tut nichts (starve). In dem Fall redet man auch davon, dass eine Anwendung CPU-Bound ist, weil die CPU Seite den Flaschenhals darstellt.

Damit kommt man zu einem der Probleme aktueller APIs und deren Treiber. Diese wollten, vom Design her, nämlich immer möglichst "Foolproof" für Anwendungen sein. Bei DX9 wird nahezu alles kompensiert was du dir vorstellen kannst. Selbst Meshdaten die nicht zu einem Shader passen werden bis zu einem gewissen Grad gepatched. Mit DX10 und DX11 hat sich Microsoft schon ein paar Schritte davon entfernt. Die APIs verzeihen deutlich weniger und haben sehr viel weniger "Schickschnack" integriert (u.A. auch validierung zur Runtime usw...). Der Overhead ist trotzallem noch viel höher als eigentlich notwendig, weil die Treiber immer noch versuchen viele Fehlerfälle abzufangen in die eine Anwendung treten kann.

Beispielsweise vermittelt das Immediate-Device der Anwendung, das GPU und CPU vollkommen synchron laufen und Kommandos sofort verarbeitet werden. Das im Hintergrund immer noch Commandbuffer aufgezeichnet und verzögert Abgearbeitet werden ist für die Anwendung komplett transparent. Das heißt, Anwendungen müssen sich nicht darum kümmern zu prüfen ob Ressourcen ggf noch an einem Puffer gebunden sind, der noch gar nicht von der GPU abgearbeitet wurde. Wenn solche Ressourcen nämlich gelöscht/überschrieben werden, dann steht die GPU auf einmal mit einem Puffer voller 'Danglingpointer' da und greift auf nicht vorhandenen oder geänderten Speicher zu. Das und viele andere Dinge wird vom Treiber automatisch verwaltet. Da der Treiber aber nicht weiss was eine Anwendung genau tun möcht, muss die Logik so allgemein wie möglich funktionieren, was schlussendlich zu einem unnötig hohen CPU Overhead führt.

Ein weiteres Problem, das schon seit langem bemängelt wurde, ist, dass APIs für den PC (GL, DX) moderne Hardware nicht besonders gut abbilden. Viele Konzepte sind noch Relikte aus vergangenen Zeiten und im API Design hängen geblieben. APIs die auf Konsolen verwendet werden machen das seit jeher viel besser und erlauben den Entwicklern ein "hardwarenäheres" programmieren. Der o.g. CPU Overhead existiert dort (meistens) nicht und die Anwendungen können sehr viel mehr aus der Grafikkarte holen als auf dem PC.

DirectX12 und Vulkan wollen jetzt etwas ähnliches erreichen. Nämlich den CPU Overhead weitgehend aus dem Treiber entfernen und an die Anwendung übergeben. D.h. die Anwendungen müssen wissen wie die GPU tickt und alle Fallen selbst entschärfen. Dafür können Applikationsspezifische Lösungen verwendet werden und ggf massiv CPU-Last eingespart werden. Also ein ganz ähnliches Arbeiten, wie es von den Konsolen bekannt war. Das führ uns dann auch unweigerlich zu...


Wieso funktioniert multithread rendering überhaupt? Man hat soch trotzdem nur ein GPU Kern, der alles berechnet. Wieso ist das dann schneller?


Alte APIs waren von Design her für Singlethreaded Anwendungen gedacht. Es gibt durchaus Möglichkeiten auch damit Multithreaded zu entwickeln (DX9-Style-MT) aber einen richtigen Support dafür gabs noch nie. Mit DX11 wollte Microsoft das mit dem Deferred-Context-Konzept ändern. Von der Idee her war das zwar gut, aber die Umsetzung ist i.A. so schlecht, das es kaum bis keinen Vorteil gibt Deferred Kontexte zu verwenden. DX12 und Vulkan sind inhärent für multithraded Applikationen gedacht. Dabei geht es nicht darum einzelne Drawcalls von verschiedenen GPUs verarbeiten zu lassen (Multi-GPU/Async Compute Lösungen sind ein anderer Part) sondern es geht darum auf der CPU einen Frame auf mehreren Kernen zusammenbauen zu lassen, also ganz konkret: Mehrere Commandbuffer werden auf verschiedenen GPUs aufgebaut und dann seriell in eine Queue (an die GPU) dispatched.

Durch diese ganze Lastenverteilung und veringerter CPU Overhead bleibt deutlich mehr Leistung übrig für andere Tasks, oder ermöglicht es Anwendungen auf mobiler Hardware energiesparend zu laufen, oder natürlich die Anzahl der Drawcalls massiv zu erhöhen.
@D13_Dreinig

Julién

Alter Hase

Beiträge: 717

Wohnort: Bayreuth

Beruf: Student | Hilfswissenschaftler in der Robotik

  • Private Nachricht senden

53

08.04.2015, 14:18

Diese Antwort, David, soll unbedingt in die Forenwiki. Ich habe alles verstanden :thumbsup:
Danke :thumbup:
I write my own game engines because if I'm going to live in buggy crappy filth, I want it to me my own - Ron Gilbert

Nimelrian

Alter Hase

Beiträge: 1 216

Beruf: Softwareentwickler (aktuell Web/Node); Freiberuflicher Google Proxy

  • Private Nachricht senden

54

08.04.2015, 14:56

Erstmal danke für den ausführlich Post. Wusste gar nicht, dass wir hier einen GDev an Bord haben.

Mehrere Commandbuffer werden auf verschiedenen GPUs aufgebaut und dann seriell in eine Queue (an die GPU) dispatched.

Sollte GPUs hier nicht CPUs heißen?
Ich bin kein UserSideGoogleProxy. Und nein, dieses Forum ist kein UserSideGoogleProxyAbstractFactorySingleton.

David_pb

Community-Fossil

  • »David_pb« ist der Autor dieses Themas

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

55

08.04.2015, 15:06

Wusste gar nicht, dass wir hier einen GDev an Bord haben


Wir haben sogar mehrere, soweit ich weiß.

Sollte GPUs hier nicht CPUs heißen?


Ja, du hast absolut recht! :)
@D13_Dreinig

David_pb

Community-Fossil

  • »David_pb« ist der Autor dieses Themas

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

56

13.04.2015, 09:16

Intel hat einen neuen Artikel veröffentlicht, in dem die neuen Resourcebinding-Konzepte von DirectX12 erläutert werden: Link
@D13_Dreinig

Julién

Alter Hase

Beiträge: 717

Wohnort: Bayreuth

Beruf: Student | Hilfswissenschaftler in der Robotik

  • Private Nachricht senden

57

13.04.2015, 16:35

SPIR-V Spezifikationen wurden released!
I write my own game engines because if I'm going to live in buggy crappy filth, I want it to me my own - Ron Gilbert

Nimelrian

Alter Hase

Beiträge: 1 216

Beruf: Softwareentwickler (aktuell Web/Node); Freiberuflicher Google Proxy

  • Private Nachricht senden

58

11.08.2015, 01:13

Ich bin kein UserSideGoogleProxy. Und nein, dieses Forum ist kein UserSideGoogleProxyAbstractFactorySingleton.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

59

11.08.2015, 06:47

Ehrlich gesagt kann ich nicht abschätzen wie sinnvoll dieser Vergleich ist. Ja, die Command-Buffers werden prepared und reused, aber geht das auch, wenn jeder Zwerg animiert wäre? Oder gäbe es da schon Probleme mit dem reuse? Vermutlich wird der Bonus durch Multi-Core noch immer da sein. Dennoch halte ich statischen Content für leicht ungeeignet, um die Power einer Engine oder Spezifikation zu zeigen.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »BlueCobold« (11.08.2015, 06:53)


Nimelrian

Alter Hase

Beiträge: 1 216

Beruf: Softwareentwickler (aktuell Web/Node); Freiberuflicher Google Proxy

  • Private Nachricht senden

60

30.08.2015, 15:05

Eventuell habt ihr ja mitbekommen, dass vor kurzem ein DX12 Benchmark mit Ashes of the Singularity erschienen ist und AMD wesentlich mehr von DX12 profitiert als Nvidia.

Oxide Games (Devs) haben jetzt ein wenig Einsicht in die wahrscheinlichen Gründe für diesen Unterschied gegeben.

Money Quotes:

Zitat

Personally, I think one could just as easily make the claim that we were biased toward Nvidia as the only 'vendor' specific code is for Nvidia where we had to shutdown async compute. By vendor specific, I mean a case where we look at the Vendor ID and make changes to our rendering path. Curiously, their driver reported this feature was functional but attempting to use it was an unmitigated disaster in terms of performance and conformance so we shut it down on their hardware. As far as I know, Maxwell doesn't really have Async Compute so I don't know why their driver was trying to expose that. The only other thing that is different between them is that Nvidia does fall into Tier 2 class binding hardware instead of Tier 3 like AMD which requires a little bit more CPU overhead in D3D12, but I don't think it ended up being very significant. This isn't a vendor specific path, as it's responding to capabilities the driver reports.

Zitat

I suspect that one thing that is helping AMD on GPU performance is D3D12 exposes Async Compute, which D3D11 did not. Ashes uses a modest amount of it, which gave us a noticeable perf improvement. It was mostly opportunistic where we just took a few compute tasks we were already doing and made them asynchronous, Ashes really isn't a poster-child for advanced GCN features.

Our use of Async Compute, however, pales with comparisons to some of the things which the console guys are starting to do. Most of those haven't made their way to the PC yet, but I've heard of developers getting 30% GPU performance by using Async Compute. Too early to tell, of course, but it could end being pretty disruptive in a year or so as these GCN built and optimized engines start coming to the PC. I don't think Unreal titles will show this very much though, so likely we'll have to wait to see.

Zitat

Nvidia made some incorrect statements, and at this point they will not dispute our position if you ask their PR. That is, they are not disputing anything in our blog. I believe the initial confusion was because Nvidia PR was putting pressure on us to disable certain settings in the benchmark, when we refused, I think they took it a little too personally.
Ich bin kein UserSideGoogleProxy. Und nein, dieses Forum ist kein UserSideGoogleProxyAbstractFactorySingleton.

Werbeanzeige