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

FSA

Community-Fossil

  • »FSA« ist der Autor dieses Themas
  • Private Nachricht senden

1

03.07.2013, 21:30

Ab wann lohnt sich Hadrware-Instancing?

Simple Fragen: Ab wann lohnt sich Hardware-Instancing? Kann Hardware-Instancing langsamer sein als normales Zeichnen? Wie sieht es aus bei einem Objekt?
Danke :)

Zitat

Der RCCSWU (RandomCamelCaseSomtimesWithUndersquare) Stil bricht auch mal mit den veraltet strukturierten Denkmustern und erlaubt dem Entwickler seine Kreativität zu entfalten.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »FSA« (04.07.2013, 14:51)


David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

2

04.07.2013, 00:57

Ich bin zwar kein Experte darin, aber ich würde schon sagen:
Ja, es kann langsamer sein. Du brauchst für das Instancing etwas mehr Aufwand um es zu "initialisieren" als wenn du direkt drauflos zeichnest.
Wenn du die dafür zusätzlich draufgegangene Zeit nicht wieder durch das schnellere Rendering reinholen kannst, dann ist es langsamer.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

3

04.07.2013, 01:16

Ich finde die interessanteste Frage hier ist erstmal: Wieso willst du zum Rendern eines einzelnen Models Instancing verwenden? ;)

Natürlich hat Instancing potentiell einen gewissen (vermutlich aber relativ kleinen) Overhead. Instancing bringt vor allem dann was, wenn du viele eher kleine Modelle rendern willst, die eben ohne Instancing viele kleine Batches erzeugen würden. Wenn du dagegen z.B. einfach nur vier Instanzen eines riesigen Models (sagen wir mal 100k+ Dreiecke pro Instanz) rendern willst, wird Instancing schon wieder eher wenig bringen...

TGGC

1x Rätselkönig

Beiträge: 1 799

Beruf: Software Entwickler

  • Private Nachricht senden

4

04.07.2013, 08:32

Es lohnt sich ab 17:23 und 12s. Und zwar auf jedem Rechner und Grafikkarte. So, nun weisst du es...

5

04.07.2013, 08:32

Ich finde die interessanteste Frage hier ist erstmal: Wieso willst du zum Rendern eines einzelnen Models Instancing verwenden? ;)

Nun, man könnte eine 3D Engine schreiben, die nach Modellen sortiert rendert und dann grundsätzlich mittels Instancing Rendern, egal wie viele Modelle man jetzt hat. Das Vorteil läge dann darin, dass man einfach alles gleich behandelt und so der Code einfacher und übersichtlicher wird.
Lieber dumm fragen, als dumm bleiben!

Schrompf

Alter Hase

Beiträge: 1 470

Wohnort: Dresden

Beruf: Softwareentwickler

  • Private Nachricht senden

6

04.07.2013, 11:10

Zusatzkosten von Instancing: ein minimales bisschen mehr CPU-Last für den evtl. notwendigen zweiten VertexBuffer. Auf GPU-Seite ein gewisses Bisschen mehr Last auf dem Input Assembler für das Zusammenstellen der VertexStruktur aus zwei verschiedenen Buffern.

Der zusätzliche Buffer für die Instancing-Daten kann sich aber erübrigen, wenn man die zur Verfügung gestellten IDs im Shader schlau ausnutzen kann. Das gilt dann ebenso für die zusätzlichen Kosten am Input Assembler. Für extreme Instancing-Anwendungen (einige 100k Instanzen eines Quads) frisst der IA nämlich enorme Rechenzeit, was ich mit DX10 und VertexID hätte komplett sparen können.

Potentieller Gewinn: nunja, man spart die DrawCalls für jedes einzelne Modell. Die sind aber eh recht billig, weil sie ja nur aus einer Kette Konstanten-Update - DrawIndexed bestehen. Wenn man sehr viele Instancing DrawCalls hat, kann es sich tatsächlich wie von Jonathan beschrieben lohnen, auch Einzelobjekte per Instancing zu zeichnen, weil dann der (meist aufwändige) Wechsel der Inputdeklaration wegfällt. Das ist aber hier nur DX9-Erfahrung, vielleicht ist das ab DX10 viel einfacher.

Intern ist heutzutage Instancing und Nicht-Instancing eh dasselbe, soweit ich weiß. Wenn man also die Instanz-Daten per Konstantenpuffer zur Verfügung stellt und per InstanceID adressiert, sollte Instancing nur noch eine Parameterfrage sein. Bei den Splitterwelten hatte ich für alle möglichen Ecken Instancing benutzt und pro Instanz eine 4x3-Matrix und eine SH 3. Grades zusammengequetscht auf 10 Konstantenregister x4 float. Wenn man also ab DX10 einen Konstantenpuffer nur für Instanz-Daten abstellt, kann man damit immerhin schon 400 Instanzen zeichnen. Mehr als die hatte ich glaube nur per Sprite Batches, also z.B. Partikelsystem. Ist also eigentlich ne prima Sache.
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.

FSA

Community-Fossil

  • »FSA« ist der Autor dieses Themas
  • Private Nachricht senden

7

04.07.2013, 14:49

@Jonathan: Genau das ist mein Vorhaben. Aktuell rendere ich einfach drauf los und lese das zu rendernde Modell aus einem std::vector. Das geht auf dauer natürlich nicht gut.

@Schrompf: Danke für die Erklärung. Was genau ist SH 3. Grades?
Bei mir wären es wohl 20xfloat. Also 5xfloat4. Ist das annehmbar? Ein Beispiel: Ich habe zwei mal einen Quader aus 36 Vertices. Lohnt sich der höhere Speicheraufwand bzw. die höhere Rechenleistung in Relation zur Renderzeit?
Ich bin übrigens auf DirectX9 unterwegs.

Zitat

Der RCCSWU (RandomCamelCaseSomtimesWithUndersquare) Stil bricht auch mal mit den veraltet strukturierten Denkmustern und erlaubt dem Entwickler seine Kreativität zu entfalten.

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

8

04.07.2013, 14:58

SH = Spherical Harmonics, wird benutzt um Beleuchtung durch beliebig viele Lichtquellen mit einer konstanten Anzahl von Koeffizienten zu approximieren.
http://en.wikipedia.org/wiki/Spherical_harmonic_lighting

Schrompf

Alter Hase

Beiträge: 1 470

Wohnort: Dresden

Beruf: Softwareentwickler

  • Private Nachricht senden

9

04.07.2013, 15:27

Bei mir wären es wohl 20xfloat. Also 5xfloat4. Ist das annehmbar? Ein Beispiel: Ich habe zwei mal einen Quader aus 36 Vertices. Lohnt sich der höhere Speicheraufwand bzw. die höhere Rechenleistung in Relation zur Renderzeit?
Ich bin übrigens auf DirectX9 unterwegs.


Du scheinst immernoch davon auszugehen, dass es eine konkrete Antwort auf diese Frage gibt. Gibt es aber nicht. Es hängt viel davon ab, wie Deine Renderpipeline aussieht, ob Du für das Instancing irgendwelche Kompromisse eingehen musst oder ob Du für das Instancing teure State Changes machen musst, wie z.B. die Input Declaration wechseln. Wenn Du fünf Modelle zu je 10k Vertizes hast und durch Instancing alle fünf zeichnen müsstest, obwohl nur drei im Blick sind, dann ist es Verschwendung. Wenn Du zehn Würfel zu je 24 Vertices hast, wirst Du den Unterschied zwischen Instancing und Nicht-Instancing nicht mal messen können. Wenn Du 200 Würfel hast, die alle gleichartig sind, könnte es sich lohnen.

Probier es doch einfach aus.
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.

FSA

Community-Fossil

  • »FSA« ist der Autor dieses Themas
  • Private Nachricht senden

10

17.07.2013, 23:45

So habe jetzt Intensiv rumprobiert. Bei 3 verschiedenen Objekten ist Instancing ab insgesamt ca. 200 Objekten schneller. Ansonsten geht viel Zeit für das Sortieren und Updaten der Buffer drauf. Auch mit Multithreading ist es erst effizient ab ca. 140 Objekten. (Alles ohne Frustum Culling)

Zitat

Der RCCSWU (RandomCamelCaseSomtimesWithUndersquare) Stil bricht auch mal mit den veraltet strukturierten Denkmustern und erlaubt dem Entwickler seine Kreativität zu entfalten.

Werbeanzeige