Instancing Performancegewinn auf GPU

Für Fragen zu Grafik APIs wie DirectX und OpenGL sowie Shaderprogrammierung.
Antworten
Matthias Gubisch
Establishment
Beiträge: 470
Registriert: 01.03.2009, 19:09

Instancing Performancegewinn auf GPU

Beitrag von Matthias Gubisch »

Hallo Leute

Ich hab mal eine Frage an die Experten zum Thema Performancegewinn durch Instancing.
Unter DirectX11 war Instancing ja noetig weil DrawCalls unendlich viel CPU Zeit verschlungen haben.

Jetzt mit DirectX12 geht das durch pralleles Zusammenbauen der CommandLists, Bundels und Asynchrones Rendering ja deutlich entspannter vonstatten und Instancing ist eigentlich (zumindest fuer meine aktuelle Anwedung) so nicht noetig da ich CPU Zeit ohne Ende uebrig hab, aber die GPU Zeit langsam knapp wird.


Mein aktueller Renderer faengt so ab 10k gleiche Objekte an, dass die Render Zeit auf der GPU zu lange wird.
Jetzt die eigentliche Frage: hat jemand Erfahrungswerte ob Instancing auch die Ausfuehrungszeit auf der GPU verkuerzt, ich hier also noch ein paar Prozent Performance herauskitzeln kann?

Das Ziel sind aktuell so um die 50k Objekte in der Scene, davon werden immer Bloecke in der groesse 3k -4k gleiche Objekte sein.
Bevor man den Kopf schüttelt, sollte man sich vergewissern einen zu haben
Benutzeravatar
Schrompf
Moderator
Beiträge: 4838
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas Ziegenhagen
Wohnort: Dresden
Kontaktdaten:

Re: Instancing Performancegewinn auf GPU

Beitrag von Schrompf »

Meine Erfahrungen noch zu DX9-Zeiten waren, dass Instancing gar nicht sooo viel bringt, solange die Anzahl nur ein paar Dutzend ist. Bei ein paar tausend Instanzen würde ich aber schon auf drastische Zuwächse tippen, selbst unter DX12. Ab ein paar hunderttausend sehr primitiven Instanzen kann es sich dann wieder lohnen, anderweitige Methoden zu finden, um die DrawCalls zusammen zu fassen. Mein VoxelRenderer hat die vierfache Framerate erreicht, nachdem ich ne halbe Million Instanzen eines Quads auf ein paar tausend VertexBuffer mit jeweils x Quads umgebaut habe.
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
Matthias Gubisch
Establishment
Beiträge: 470
Registriert: 01.03.2009, 19:09

Re: Instancing Performancegewinn auf GPU

Beitrag von Matthias Gubisch »

Pro Objekt existiert aktuell nur 1VB/IB/TextrueSet, das sich alle Instanzen teilen
Auf der CPU hab ich wie gesagt kein Problem aktuell, wenn ich das hochinterpoliere gehe ich davon aus dass ich so ca 100k Drawcalls pro Frame unterbringe.

Die Frage ist ob die GPU (der GPU Scheduler) besser optimieren kann wenn ich einen Drawcall per Instancing schicke anstatt viele viele Einzeldrawcalls in der Commandlist, und wenn ja in welcher Groessenordnung der Performancegewinn da zu erwarten ist.

Hat da jemand Erfahrung damit?

Weniger groessere VertexBuffer ist noch eine weiter Idee.

Sobald die Baustelle Renderer Performace abgeschlossen ist kann ich wieder am Content basteln. Dann gibts hoffentlich auch Bilder hier ;)
Bevor man den Kopf schüttelt, sollte man sich vergewissern einen zu haben
Benutzeravatar
Krishty
Establishment
Beiträge: 8229
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Instancing Performancegewinn auf GPU

Beitrag von Krishty »

Matthias Gubisch hat geschrieben: 03.09.2019, 10:23Hat da jemand Erfahrung damit?
Leider nicht. Ich habe ähnliche Anforderungen, aber mein Umstieg auf Vulkan steht noch aus. Dann werde ich Instancing aber definitiv ausprobieren – ich brauche es für pro-Objekt-Zugriff auf die dynamischen Transformationsmatrizen.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Antworten