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

1

26.05.2013, 20:02

effizient Zeichnen

Hallo, c++ visual studio 2012 directx 11


Ich habe oft gelesen man sollte die gesamte Szene, die es zu zeichnen gilt mit einem einzigen draw-Befehel an directx zeichnen.

Nun habe ich ein Modell ( es werden keine texturen verwendet), welches sich in der Scene oft wiederholt und sich in jedem frame um x grad dreht.

Man könnten nun einen dynamischen vertexbuffer verwenden und pro frame die Objekte ,welche gezeichnet werden sollen um x grad drehen, in den dynamischen Vertexbuffer schreiben und alles mit einem einzigen draw-Befehl zeichnen lassen.

Oder ich verwende einen statischen Vertexbuffer und verwende eine Worldmatrix und rufe für jedes Objekt einen draw-Befehl an directx.

Ich würde gerne wissen was schneller ist?

Legend

Alter Hase

Beiträge: 731

Beruf: Softwareentwickler

  • Private Nachricht senden

2

26.05.2013, 20:23

Ich glaube du willst Instancing benutzen.
Dann setzt du einen Draw-Befehl ab und die GPU vervielfältigt für dich die Daten von dem sich wiederholenden Modell. Dazu kannst du dann auch die notwendigen Daten wie z.B. Positionsdaten mitgeben.
"Wir müssen uns auf unsere Kernkompetenzen konzentrieren!" - "Juhu, wir machen eine Farm auf!"

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

3

26.05.2013, 20:29

Danke, genau was ich gesucht habe.

Trotzdem würde mich interessieren, ob es besser ist eine Worldmatrix, einen statischen Vertexbuffer und viele draw-Aufrufe zu verwenden oder keine Worldmatrix, dafür einen dynamischen Vertexbuffer und einen draw-Aufruf.

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

4

27.05.2013, 08:24

Trotzdem würde mich interessieren, ob es besser ist eine Worldmatrix, einen statischen Vertexbuffer und viele draw-Aufrufe zu verwenden oder keine Worldmatrix, dafür einen dynamischen Vertexbuffer und einen draw-Aufruf.


Das hängt von vielen Faktoren ab, daher gibt es auf die Frage keine befriedigende Antwort. Im Allgemeinen möchte man aber den Datenverkehr zwischen CPU-GPU möglichst gering halten. D.h. dynamisch Batchen solltest du nur falls notwendig; und dann nur das Minimum an Daten. Sollte sich die Position deiner Modelle nicht ändern, kannst du diese auch, soweit möglich, in einen statischen Vertexpuffer packen. Schließlich solltest du dir natürlich auch Gedanken über potentielles Culling machen. Die Grafikkarte freut sich genauso wenig über viele tausende Drawcalls wie über einen Drawcall mit zu vielen Polygonen.
@D13_Dreinig

5

27.05.2013, 08:38

Ich glaube das es gar nicht so sehr darum geht was 'besser' ist, eine statische 'Worldmatrix' mag möglicherweise (je nach implementierung) schneller sein, aber wenn ich darüber nachdenke das ich quasi ALLES in einem Buffer handlen soll fehlt alle flexibilität... ich glaube darunter leidet mehr als man gewinnt...

Ob OpenGL oder Direct3D dürfte der Schwerpunkt immer am Scene-Managment liegen... culling, draw-calls, shader ect... wenn die aufrufe bestmöglich optimiert sind hast du beides, flexibilität und vielfalt sowie gute performance... und das ganze ist keineswegs trivial...

Nicht umsonst scheitern viele bei den Versuch eine 3D engine zu schreiben, oder greifen auf fertige Engines zurück...

Sich ein paar der Open Source Engines anzusehen kann sich durchaus lohnen...
kann man viel von lernen...

6

27.05.2013, 11:18

Wäre ganz nett, wenn man mir ein paar Open Source Engines nennen würde.

7

27.05.2013, 11:34

Kannst dir ja mal OGRE anschauen oder Irrlicht sind 2 Open Source Engine

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Snowfox« (27.05.2013, 13:50)


wluc-16

Treue Seele

Beiträge: 212

Wohnort: in der Nähe von Bielefeld :D

Beruf: Schüler

  • Private Nachricht senden

Schrompf

Alter Hase

Beiträge: 1 470

Wohnort: Dresden

Beruf: Softwareentwickler

  • Private Nachricht senden

9

30.05.2013, 11:34

Fremden Code zu lesen ist meiner Meinung nach keine gute Idee. Du wirst mit genügend Ausdauer (also mehrere Tage Zeitaufwand) zwar wirklich was dabei lernen, aber sicher nicht das, weswegen Du da hingekommen bist. Dazu ist es einfach zuviel Code.

Mein Kurzabriss zu performantem Rendern:

- alles mit nur einem DrawCall zu zeichnen ist unmöglich und auch unwichtig.
- wenige DrawCalls sind wichtig. Für gute Performance auf aktuellen Rechnern solltest Du ganz grob folgende Zahlen im Blick behalten:
DX9, 60fps: 5k Drawcalls
DX9, 30fps: 10k
DX10+, 60fps: 10k
Konsolen: deutlich mehr, aber das ist nur ne fiktive Zahl, weil Du da nie hinkommst.

- abgesehen von den DrawCalls ist noch einiges mehr wichtig:
- State Changes: kann obige Zahlen durchaus halbieren, wenn man nicht aufpasst. Daher immer nach State Changes sortieren
- Reihenfolge: ZBuffer, RenderTarget, Input Declaration, Shader, Texturen, Buffer, Parameter
- denk Dir was SCHLAUES zum Sortieren und Vermeiden doppelter Wechsel aus, sonst kostet Dich das mehr Rechenzeit als Du sparst
- GPU-Seite: ist auf aktuellen Gaming-Rechnern nur selten das Problem. Aber falls doch:
- Pixel Shader - eine aktuelle GPU bietet Dir bei FullHD etwa 100 Texturzugriffe und 500 MatheOps pro Pixel bei 60fps.
- und Vorsicht: GPUs variieren gewaltig. Eine Laptop-GPU hat vielleicht nur ein Zehntel davon, ein SLI-Monster-Gespann dagegen das Vierfache
- das ist trotzdem eine gewaltige Leistung, aber ein schlichtes 5x5PCF einer Lichtquelle frisst schon ein Viertel davon.
- Du kannst für eine Szene durchaus im Kopf grob überschlagen, wieviel Last auf der GPU liegt.
- Vertex Shader ist seltener ein Problem - einige 100k Dreiecke sind keine Belastung
- plus Schatten-Passes und allen sonstigen Neben-Passes kommt man da schnell auf ein paar Millionen Dreiecke
- und es ist trotzdem kein Problem.
- es gibt absonderliche Konstrukte, bei denen andere GPU-Teile als die reine Fragment-Leistung das Limit werden
- aber eh Du soweit bist, erkennst Du die Konstrukte auch selbst
- und zum Schluss: statische Daten sind zu bevorzugen, aber eine gewisse Menge Daten, die einmal oder sogar mehrmals pro Frame hochgeladen werden, bringen Deine Performance nicht um.
- solange Du auf die richtigen Ressourcen- und Map-Flags achtest. Unter DX9 sind die: POOL_DEFAULT, USAGE_DYNAMIC, LOCK_DISCARD oder LOCK_NOOVERWRITE

Alle Zahlen sind nur Hausnummern, auch das Doppelte oder die Hälfte ist durchaus im Rahmen. Aber das sollte als Grund-Aufstellung erstmal reichen.

Bye, Thomas
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

10

30.05.2013, 12:27

Konsolen: deutlich mehr, aber das ist nur ne fiktive Zahl, weil Du da nie hinkommst.


Woher kommt denn diese Info?
@D13_Dreinig

Werbeanzeige