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

Legend

Alter Hase

Beiträge: 731

Beruf: Softwareentwickler

  • Private Nachricht senden

11

03.01.2013, 14:59

Ich würde einen neuen Puffer aber nur anlegen, wenn nötig. Falls sich die Anzahl der Instanzen nicht geändert hat, solltest du auch keinen neuen Puffer anlegen.
"Wir müssen uns auf unsere Kernkompetenzen konzentrieren!" - "Juhu, wir machen eine Farm auf!"

Netzwerkbibliothek von mir, C#, LGPL: https://sourceforge.net/projects/statetransmitt/

BurningWave

Alter Hase

  • »BurningWave« ist der Autor dieses Themas

Beiträge: 1 106

Wohnort: Filderstadt/Konstanz

Beruf: Student

  • Private Nachricht senden

12

03.01.2013, 15:22

OK. Ich glaube, es ist sinnvoll, das so umzusetzen.

Jetzt werden auch Partikel instanced, was eine Erhöhung der FPS um viele 100%, wenn nicht 1000% zur Folge hatte.

Schrompf

Alter Hase

Beiträge: 1 470

Wohnort: Dresden

Beruf: Softwareentwickler

  • Private Nachricht senden

13

03.01.2013, 15:55

Das wundert mich aber. Durch Instancing für so kleine Sachen wie ein kamera-ausgerichtetes Rechteck wird die GPU deutlich langsamer. Dafür spart man halt Arbeit auf CPU-Seite und muss partikel-spezifische Daten nur noch einmal anstatt viermal pro Partikel schreiben. Wenn Du hier wirklich Faktor 10 rausgeholt hast, war wohl was mit Deiner Vertexdaten-Erzeugung faul.

Meine Erfahrung dazu: ich habe vor einiger Zeit meinen Sprite-Renderer (und damit auch Font-Rendering) auf Instanced Particles umgestellt. Dabei habe ich auch Rotation, Skalierung und Texturkoord-Begrenzung für saubere Interpolation in den VertexShader geschoben. Das hat zwar einiges an Rechenzeit auf CPU-Seite eingespaart, aber in der Praxis war eigentlich immer die Grafikkarte das Problem. Wirklich was gebracht hat es erst bei vielen Hunderttausend winzigen Partikeln. Als ich diese Technik dann meinen Voxel-Renderer anwenden wollte, der viele Millionen kleine Voxel als kamera-ausgerichtete Quadrate rendert, stellte sich heraus, dass der Input Assembler ein echter Engpass ist. Beim Voxel-Renderer zeichne ich jetzt wieder Partikel ohne Instancing, das hat die Framerate verdreifacht.

Dazu noch einen Tipp, den ich leider noch nicht selbst ausprobiert habe: Zeichne nur Punkte - also einzelne Vertizes - und blase die im GeometrieShader zu zwei Dreiecken auf. Damit vermeidest Du die etwas langsame Komplexität im Input Assembler und musst trotzdem nur einmal Vertexdaten pro Partikel hochladen. Geht natürlich erst ab DX10, weswegen ich das noch nicht erprobt habe.
Häuptling von Dreamworlds. Baut aktuell an nichts konkretem, weil das Vollzeitangestelltenverhältnis ihn fest im Griff hat. Baut daneben nur noch sehr selten an der Open Asset Import Library mit.

Legend

Alter Hase

Beiträge: 731

Beruf: Softwareentwickler

  • Private Nachricht senden

14

03.01.2013, 16:41

Es kann aber durchaus sinnvoll sein Zeit auf der CPU freizuschaufeln. ;)
Bei einem kompletten Spiel hat man ja nicht nur Grafik.
"Wir müssen uns auf unsere Kernkompetenzen konzentrieren!" - "Juhu, wir machen eine Farm auf!"

Netzwerkbibliothek von mir, C#, LGPL: https://sourceforge.net/projects/statetransmitt/

BurningWave

Alter Hase

  • »BurningWave« ist der Autor dieses Themas

Beiträge: 1 106

Wohnort: Filderstadt/Konstanz

Beruf: Student

  • Private Nachricht senden

15

03.01.2013, 16:45

Vielen Dank für den Tipp. Ich werde es vorerst jedoch bei Instancing belassen (der Einfachheit halber). Die drastische Steigerung der Framerate hängt damit zusammen, dass ich zuvor für jede Instanz einen Constantpuffer gemappt habe, um die jeweilige Weltmatrix übergeben zu können (was natürlich der denkbar schlechteste Weg ist).

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

16

03.01.2013, 16:54

Ich bin mittlerweile zu D3D11_USAGE_IMMUTABLE für die Instanzpuffer umgestiegen.


Wieso IMMUTABLE? Damit kannst du den Puffer ja nie mehr updaten. Vermutlich fährst du mit einem dynamischen Puffer (D3D11_USAGE_DYNAMIC) besser den du einmal initialisierst. Den Inhalt kannst du dann beim Mappen als "verworfen" markieren.
@D13_Dreinig

BurningWave

Alter Hase

  • »BurningWave« ist der Autor dieses Themas

Beiträge: 1 106

Wohnort: Filderstadt/Konstanz

Beruf: Student

  • Private Nachricht senden

17

03.01.2013, 17:20

Gut, dieses Flag kann ich natürlich nur verwenden, wenn ich tatsächlich immer einen komplett neuen Puffer erstelle. Das mache ich jetzt nur noch, wenn sich die Anzahl an Instanzen ändert. Dementsprechend verwende ich jetzt D3D11_USAGE_DYNAMIC.

Mal eine ganz andere Frage: Beim Rendern von halbtransparenten Partikeln muss ja eigentlich die Renderreihenfolge so angepasst werden, dass das am weitesten entfernte Partikel zuerst gerendert wird, damit das Alpha-Blending korrekt funktioniert. Muss ich wirklich alle Partikel sortieren (was sicherlich viel CPU-Zeit kostet) oder gibt es andere Tricks?

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

18

03.01.2013, 17:39

Beim Rendern von halbtransparenten Partikeln muss ja eigentlich die Renderreihenfolge so angepasst werden, dass das am weitesten entfernte Partikel zuerst gerendert wird, damit das Alpha-Blending korrekt funktioniert. Muss ich wirklich alle Partikel sortieren (was sicherlich viel CPU-Zeit kostet) oder gibt es andere Tricks?


Du kannst die Sortierung auch auf der GPU durchführen. Allerdings würde ich eine Sortierung nicht unbedingt erzwingen. Bei machen Effekten gibt es hässliches "popping" von Partikeln, wenn sich die Sortierung ändert. Da möchte man vielleicht eher nach Spawnzeitpunkt sortieren, oder überhaupt nicht. Ich würde alle Optionen anbieten.
@D13_Dreinig

Schrompf

Alter Hase

Beiträge: 1 470

Wohnort: Dresden

Beruf: Softwareentwickler

  • Private Nachricht senden

19

03.01.2013, 18:45

Meine Empfehlung lautet eher: lass das Sortieren sein, nimm die Reihenfolgen-Probleme in Kauf. Nach meiner Erfahrung bemerkt das praktisch niemand.
Häuptling von Dreamworlds. Baut aktuell an nichts konkretem, weil das Vollzeitangestelltenverhältnis ihn fest im Griff hat. Baut daneben nur noch sehr selten an der Open Asset Import Library mit.

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

20

03.01.2013, 19:08

Nach meiner Erfahrung bemerkt das praktisch niemand.


Das stimmt leider nicht in jedem Fall. Ich hatte zu Beginn auch auf eine Sortierung verzichtet, aus selbigen Grund. Das ging bis zu einem gewissen Punkt gut, leider gab es irgendwann einen Partikel-Effekt, mit relativ großen (Soft-)Partikeln, der an den weichen Kanten äußerst hässliche Artefakte hatte. Eine Sortierung macht schon Sinn, allerdings kann oft darauf verzichtet werden. Daher sollten mehrere Optionen angeboten werden.
@D13_Dreinig

Werbeanzeige