Seite 1 von 1

[DX9] Konstanten vs. Buffers (Tex/VB)

Verfasst: 01.11.2011, 05:08
von Zudomon
Ich habe gehört, dass das setzen von Konstanten ein relativ teurer Befehl ist...

Mich würde interessieren, was schneller ist, Konstanten setzen oder einen Buffer locken und befüllen? Bei gleicher geringer Datenmenge.

Re: [DX9] Konstanten vs. Buffers (Tex/VB)

Verfasst: 01.11.2011, 07:59
von antisteo
Zudomon hat geschrieben:Ich habe gehört, dass das setzen von Konstanten ein relativ teurer Befehl ist...

Mich würde interessieren, was schneller ist, Konstanten setzen oder einen Buffer locken und befüllen? Bei gleicher geringer Datenmenge.
Die vielen geringen Datenmengen in einen Buffer füllen und instanced drawing machen

Re: [DX9] Konstanten vs. Buffers (Tex/VB)

Verfasst: 01.11.2011, 08:18
von Krishty
Was für eine Art von Puffer? Für Vertexdaten, die sich jeden Frame ändern, wäre DrawPrimitveUP() eine Möglichkeit …

Re: [DX9] Konstanten vs. Buffers (Tex/VB)

Verfasst: 01.11.2011, 08:56
von Zudomon
Krishty hat geschrieben:Was für eine Art von Puffer? Für Vertexdaten, die sich jeden Frame ändern, wäre DrawPrimitveUP() eine Möglichkeit …
Ich habe gelesen, dass DrawPrimitiveUP() wohl intern auch nur einen Buffer bereitstellt und locked...
antisteo hat geschrieben:
Zudomon hat geschrieben:Ich habe gehört, dass das setzen von Konstanten ein relativ teurer Befehl ist...

Mich würde interessieren, was schneller ist, Konstanten setzen oder einen Buffer locken und befüllen? Bei gleicher geringer Datenmenge.
Die vielen geringen Datenmengen in einen Buffer füllen und instanced drawing machen
Es geht mir nicht um Instancing, sondern explizit nur darum, ob es schneller ist sagen wir 50 Konstanten an nen Shader zu übergeben oder die Daten z.B. in eine Textur zu schreiben und die dann auszulesen...

Re: [DX9] Konstanten vs. Buffers (Tex/VB)

Verfasst: 01.11.2011, 09:03
von Krishty
Zudomon hat geschrieben:
Krishty hat geschrieben:Was für eine Art von Puffer? Für Vertexdaten, die sich jeden Frame ändern, wäre DrawPrimitveUP() eine Möglichkeit …
Ich habe gelesen, dass DrawPrimitiveUP() wohl intern auch nur einen Buffer bereitstellt und locked...
Ist implementierungsabhängig. Selbst, wenn, hast du noch die Chance, das in einem API-Aufruf erledigt zu haben statt in mehreren.
Zudomon hat geschrieben:Es geht mir nicht um Instancing, sondern explizit nur darum, ob es schneller ist sagen wir 50 Konstanten an nen Shader zu übergeben oder die Daten z.B. in eine Textur zu schreiben und die dann auszulesen...
Die Datenmenge ist ja beide Male gleich; was zählt, sind die Unkosten, das zur GPU zu schieben. Auf CPU-Seite ist das mit Konstanten wahrscheinlich weniger, da es weniger API-Aufrufe sind, du deinerseits keine Daten kopieren musst und der Treiber die Texel nicht umsortieren muss. Auf Seite des Busses ist es ungewiss, ob die 50 Konstanten als monolithischer Befehl zur GPU wandern (was die Texel wahrscheinlich tun würden) oder in 50 Häppchen mit je 20 B Verschnitt.

Auf der GPU sind die Konstanten definitiv schneller, weil das Lesen aus dem Constant Memory schneller und einfacher vorhersagbar ist als das Samplen einer Textur.

Re: [DX9] Konstanten vs. Buffers (Tex/VB)

Verfasst: 01.11.2011, 09:43
von Schrompf
Aus DX9-Perspektive ist das Hochladen eines Blocks von 50 Shaderkonstanten zigfach schneller als das Locken einer Textur, Hochladen der Texel und abschließendes Unlocken. Falls der Treiber dafür einen Sync auslöst, wäre die Texturlösung sogar xtausendfach teurer. Ich weiß aber nicht, ob es ab DX10 dafür bessere Methoden gibt.

Re: [DX9] Konstanten vs. Buffers (Tex/VB)

Verfasst: 01.11.2011, 09:47
von Krishty
Ab D3D10 sind alle Puffer vereinigt; es macht also keinen Unterschied, ob Konstanten, Vertex-Puffer, Index-Puffer oder Texturen gelockt (gemappt) werden. Es gibt allerdings zwei API-Funktionen dafür, deren Unterschied ich vergessen habe.