Typische Rendering-Strategie für viele und vielfältige komplexe Objekte in directx?

8

Ich lerne directx. Es bietet eine große Menge an Freiheit in Sachen, wie Dinge zu tun sind, aber vermutlich führen verschiedene Stategies unterschiedlich aus und es gibt wenig Anleitung, wie leistungsfähig Benutzermuster sein könnten.

Wenn Sie DirectX verwenden, ist es typisch, dass Sie bei jedem Rendern mehrere neue Daten mehrfach austauschen müssen?

Der offensichtlichste und wahrscheinlich wirklich ineffiziente Weg, es zu benutzen, wäre so.

Strategie 1

Auf jedem einzelnen Render

  1. Laden Sie alles für Modell 0 (inkludierte Texturen) und rendern Sie es (IASetVertexBuffers, VSSetShader, PSSetShader, PSSetShaderResources, PSSetConstantBuffers, VSSetConstantBuffers, Draw)

  2. Laden Sie alles für Modell 1 (inkludierte Texturen) und rendern Sie es (IASetVertexBuffers, VSSetShader, PSSetShader, PSSetShaderResources, PSSetConstantBuffers, VSSetConstantBuffers, Draw)

  3. usw. ...

Ich nehme an, dass Sie das teilweise effizienter machen können, wenn die größten zu beladenden Dinge dedizierte Slots erhalten, z. Wenn die Textur für Modell 0 wirklich kompliziert ist, laden Sie sie nicht bei jedem Schritt neu, laden Sie sie einfach in Slot 1 und lassen Sie sie dort liegen. Da ich natürlich nicht sicher bin, wie viele Register in DX11 von jedem Typ vorhanden sind, ist das kompliziert (kann jemand darauf verweisen?)

Strategie 2

Wählen Sie einige Textur-Slots zum Laden und andere zum dauerhaften Speichern Ihrer komplexesten Texturen.

Nur einmal

Laden Sie die kompliziertesten Modelle, Shader und Texturen in die für die dauerhafte Speicherung vorgesehenen Slots

Auf jedem einzelnen Render

  1. Laden Sie alles, was nicht bereits für Modell 0 vorhanden ist, mithilfe der zum Laden und Rendern vorgesehenen Slots (IASetVertexBuffers, VSSetShader, PSSetShader, PSSetShaderResources, PSSetConstantBuffers, VSSetConstantBuffers, Draw)

  2. Laden Sie alles, was nicht bereits für Modell 1 vorhanden ist, mit den zum Laden und Rendern vorgesehenen Slots (IASetVertexBuffers, VSSetShader, PSSetShader, PSSetShaderResources, PSSetConstantBuffers, VSSetConstantBuffers, Draw)

  3. usw. ...

Strategie 3 Ich habe keine Ahnung, aber die oben genannten sind wahrscheinlich alle falsch, weil ich wirklich neu darin bin.

Was sind die Standardstrategien für effizientes Rendering auf DirectX (speziell DX11), um es so effizient wie möglich zu machen?

    
John Robertson 20.06.2011, 23:12
quelle

2 Antworten

2

DirectX verwaltet die Ressourcen für Sie und versucht, sie im Videospeicher so lange wie möglich zu halten, um die Leistung zu optimieren, kann dies jedoch nur bis zur Grenze des Videospeichers auf der Karte tun. Es gibt auch Overhead bei jeder Zustandsänderung, auch wenn die Ressource noch im Videospeicher ist.

Eine allgemeine Strategie zur Optimierung besteht darin, die Anzahl der Zustandsänderungen während des Rendering-Durchlaufs zu minimieren. Üblicherweise bedeutet dies, alle Polygone zu zeichnen, die dieselbe Textur in einem Stapel verwenden, und alle Objekte, die in einem Stapel die gleichen Stützpunktpuffer verwenden. Im Allgemeinen würden Sie versuchen, so viele Primitive wie möglich zu zeichnen, bevor Sie den Zustand ändern, um mehr Primitive zu zeichnen.

Dies wird den Rendering-Code oft etwas komplizierter und schwieriger zu pflegen machen. Daher sollten Sie einige Profilerstellen, um zu bestimmen, wie viel Sie bereit sind zu tun.

Im Allgemeinen erhalten Sie bessere Leistungssteigerungen durch allgemeinere Algorithmusänderungen, die über den Umfang dieser Frage hinausgehen. Einige Beispiele wären das Reduzieren von Polygonzählungen für entfernte Objekte und Okklusionsabfragen. Eine beliebte wahre Phrase ist "die schnellsten Polygone sind die, die du nicht zeichnest". Hier sind ein paar schnelle Links:

Ссылка

Ссылка

Ссылка

    
dschaeffer 21.06.2011, 23:54
quelle
1

Andere Antworten sind bessere Antworten auf die Frage per se, aber bei weitem die relevanteste Sache, die ich seit der Frage gefunden habe, war diese Diskussion auf gamedev.net , in der einige große Titelspiele vorgestellt werden Zustand ändert und Aufrufe aufruft.

Was dabei herauskommt, ist, dass große Namenspiele sich scheinbar nicht zu viele Gedanken darüber machen, dh es kann viel Zeit in Anspruch nehmen, Code zu schreiben, der diese Art von Problem behandelt, und die Zeit, die für das Schreiben von Code benötigt wird damit ist es wahrscheinlich nicht die Zeit verloren, die deine Bewerbung beendet hat.

    
John Robertson 22.06.2011 15:35
quelle