Seite 1 von 1
[DX9] States sortieren, aber wonach?
Verfasst: 21.07.2009, 11:47
von Zudomon
Hi!
Man sollte ja diejenigen wechsel, die besonders Zeitraubend sind, minimieren. Z.B. ist es ja sehr langsam, Texturen zu wechseln.
Die Frage ist nur, wie sieht die Prioritätenliste aus, also wonach sollte man am besten sortieren?
Ist ein Effektwechsel oder ein Texturwechsel langsamer?
Gruß
Zudo
Re: [DX9] States sortieren, aber wonach?
Verfasst: 21.07.2009, 12:07
von Krishty
Re: [DX9] States sortieren, aber wonach?
Verfasst: 21.07.2009, 12:22
von Aramis
Im Zeitalter von Shadern, die jeweils dutzende von Texturen benötigen, halte ich das Sortieren nach Texturen für unsinnig ... Texturen kann man einzig dahingehend optimieren, dass man sie frühzeitig in den Grafikspeicher vorlädt.
Die Situation, dass der Grafikspeicher zu klein ist um alle regelmäßig benötigten Texturen zu fassen bedeutet sowieso ein Ende des Experiments 'Performance' .. insofern lohnt sich auch da ein Sortieren nach Texturen nicht mehr wirklich.
Re: [DX9] States sortieren, aber wonach?
Verfasst: 21.07.2009, 12:24
von DeRaaZuul
Genau das gleiche habe ich auch mal gesucht.Super!
Re: [DX9] States sortieren, aber wonach?
Verfasst: 21.07.2009, 12:47
von Schrompf
Wir sortieren in der Reihenfolge:
Pass - Rendertarget - Vertexdeklaration - Shader - Textur - Buffer - Parameter
Das kommt auch grob hin nach der Performance-Liste, die Krishty verlinkt hat. Details kann man sich streiten... wir sortieren z.B. auch nach Mesh und Parametern, obwohl das NULL Performance-Vorteil gebracht hat. Dafür hat es automatisches Instancing ermöglicht, was dann folgerichtig ebenso NULL Performance-Gewinn gebracht hat.
Re: [DX9] States sortieren, aber wonach?
Verfasst: 22.07.2009, 12:11
von Zudomon
Schrompf hat geschrieben:Dafür hat es automatisches Instancing ermöglicht, was dann folgerichtig ebenso NULL Performance-Gewinn gebracht hat.
Was meinst du damit?
Re: [DX9] States sortieren, aber wonach?
Verfasst: 22.07.2009, 12:42
von Schrompf
Damit meine ich: automatisches Instancing hat bei uns mehr Rechenzeit gefressen, als es gebracht hat.
Definition:
Das automatische Zusammenfassen von mehreren Renderjobs, die sich nur in Objektmatrix und evtl. instanziierbaren Parametern unterscheiden, in einen einzelnen Renderjob mit Instancing.
Vorteile:
Man spart die wiederholten Aufrufe an SetVertexConstant() und DrawIndexedPrimitive()
Nachteile:
Man muss einen temporären VertexBuffer locken, mit den Instanzdaten füttern, unlocken.
Man muss die Vertexdeklaration auf die Instancing-Version der vom Mesh verlangten Deklaration setzen.
Man muss den VertexShader evtl. gegen eine Permutation mit Instancing austauschen.
Ergebnis:
Nachteile fressen mehr Performance als die Vorteile bringen. Ich habe dann auch probiert, alle Renderjobs als Einzel-Instanzjobs umzusetzen. Das hat die Anzahl der VertexDekl-Wechsel drastisch reduziert und einiges an Tempo gebracht, aber war *immernoch* langsamer als bei schlichtem linearen Abarbeiten der vorsortierten Renderjob-Liste.
Wobei ich das irgendwann mal mit ShaderConstant-Instancing ausprobieren muss. Dann würde die Aktualisierung des Instanz-VertexBuffers entfallen, man könnte für jeden Auftrag denselben nehmen. Den könnte man dann auch immer angeklemmt lassen und müsste nur die Matrix-Tabelle im VertexShader aktualisieren. Und die Anzahl der VertexDekl-Wechsel wäre auf historischem Tiefpunkt. Hmm.... Ich schreibe Bescheid, wenn ich was rausbekomme.
Bye, Thomas