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

DigitalDream

Frischling

  • »DigitalDream« ist der Autor dieses Themas

Beiträge: 66

Beruf: Entwickler

  • Private Nachricht senden

11

21.11.2006, 15:18

Oh man,ich glaub es dämmert ...

Und zwar anhand des Beispiels UpdateWater auf Seite 323 in der neuen Auflage.

Um Zeit zu sparen werden in der Schleife erstmal die einzelnen Vertex aktualisiert,somit wird also die Zeit zwischen Lock und Unlock um einiges reduziert und der Grafikspeicher ist nicht so lange gesperrt.

Richtig?

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

12

21.11.2006, 15:29

ganz richtig! (s.o.) Ach wird ja manchmal garnichts verändert, sondern man will nur was überprüfen (ebenfalls s.o.) :)
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

DigitalDream

Frischling

  • »DigitalDream« ist der Autor dieses Themas

Beiträge: 66

Beruf: Entwickler

  • Private Nachricht senden

13

21.11.2006, 15:32

Ok,soweit so gut.

Gehen wir jetzt mal vo nder Situation aus,wir hätten nicht unser Vertexbufferklasse.
Nun müsste man in der Schleife ja nicht pro Vertex Lock und Unlock aufrufen.
Sondern man könnte vor der Schleife das Lock setzen und nach der Schleife das Unlock.

Das dies mehr Zeit kostet als ein memcpy des gesamten temporären buffers haben wir ja bereits geklärt.

Aber die Aussage warum man ohne Klasse öfter Lock/Unlock aufrufen müsste,leuchtet mir immer noch nicht ganz ein.

Also in welcher Situation gäbe es einen Grund mehrmals Lock und Unlock aufzurufen ohne unsere Klasse?

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

14

21.11.2006, 15:34

das sagt ja auch niemand.

aber was wenn du z.b. für kollisionsabfragen einfach nur die geometriedaten des modells brauchst?

wirst du da dann auch locken und diese auslesen?

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

15

21.11.2006, 15:36

Also es gibt meiner Meinung nach 2 Anwendungsgebiete:
- das Ändern des Inhalts
- das Überprüfen des Inhalts

Beim ersten Fall kann die Klasse helfen, die Lock-Zeiten zu verkürzen. Beim zweiten Fall macht eine solche Klasse den Lock sogar komplett unnötig.
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

DigitalDream

Frischling

  • »DigitalDream« ist der Autor dieses Themas

Beiträge: 66

Beruf: Entwickler

  • Private Nachricht senden

16

21.11.2006, 15:37

Zitat von »"dot"«

das sagt ja auch niemand.


Aber was meintest du dann mit hin und her in deinem Beispiel mit dem Laufburschen?

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

17

21.11.2006, 15:40

ich wollte damit sagen, dass es keine gute idee ist, den buffer wann immer man will zu locken, nur weil man sich keine kopie der daten halten will.

512 MB VRAM bedeuten nicht, dass man diese gleich nutzen sollte um RAM zu sparen, eher sollte man sie so nutzen, dass möglichst wenig über den BUS muss...

außerdem hat jeder API call seinen overhead, der dir so erspart bleibt.

z.B. dazu

Zitat

Ja,aber der VB kann doch im Lock bleiben bis zum rendern,und erst wenn alle Änderungen im VB getan sind,wird eben unlock aufgerufen.


wenn du jetzt DrawPrimitive aufrufst, dann heißt das nicht, dass die GPU rendert und DrawPrimitive dann zurückkehrt.
die GPU rendert vielleicht gleich, vielleicht später weil sie grad noch was andres im sinn hat.
wenn du jetzt hergehst und nur kurz unlockst um schnell zu rendern und dann wieder lockst, dann müssen GPU und CPU andauernd aufeinander warten, was den sinn einer GPU sehr schnell zu nichte macht ;) (gut, wer weis was der treiber macht und z.b. mit D3DLOCK_DISCARD ist das evtl. nicht so dramatisch, aber es geht ums prinzip)

außerdem kann es ja durchaus sein, dass du vertexattribute hast, die die graka zum rendern gar nicht benötigt (was weis ich; boneindex bei einem softwareskinning system), warum diese dann über den bus schicken?.

.
.
.

Zitat von »"dx sdk doku"«

Locking a static vertex buffer while the graphics processor is using the buffer can have a significant performance penalty. The lock call must wait until the graphics processor is finished reading vertex or index data from the buffer before it can return to the calling application, a significant delay. Locking and then rendering from a static buffer several times per frame also prevents the graphics processor from buffering rendering commands, since it must finish commands before returning the lock pointer. Without buffered commands, the graphics processor remains idle until after the application is finished filling the vertex buffer or index buffer and issues a rendering command.

DigitalDream

Frischling

  • »DigitalDream« ist der Autor dieses Themas

Beiträge: 66

Beruf: Entwickler

  • Private Nachricht senden

18

21.11.2006, 16:43

Zitat von »"dot"«



wenn du jetzt hergehst und nur kurz unlockst um schnell zu rendern und dann wieder lockst, dann müssen GPU und CPU andauernd aufeinander warten (gut, wer weis was der treiber macht und z.b. mit D3DLOCK_DISCARD ist das evtl. nicht so dramatisch, aber es geht ums prinzip)


Ich sprach eigentlich davon,wenn du beabsichtigst einen VB zu ändern ,dann ist es ja dein Ziel diese Änderung sichtbar zu machen also zu rendern.
Und somit weisst du bereits genau was du ändern willst,packst das ganze also auch ohne Klasse zwischen ein Lock und Unlock ,und fertig.

Der einzige Vorteil,der aber für die Klasse spricht ist die verkürzte Lockzeit. Wie ich am Beispiel von WaterUpdate bereits sehen konnte.

Denn lediglich die Zeit zwischen einem Lock und Unlock aufruf ist in der Klasse kürzer als ohne Klasse.

Und so ist es ja eigentlich auch im Buch erklärt auf Seite 302 "Der Trick mit der Speicherkopie"
Nur hatte ich das missverstanden,nämlich das man ohne Klasse mehrfach Lock und Unlock aufrufen müsste. Aber diese Aussage hat es nie gegeben und war ein Irrtum meinerseits ...

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

19

21.11.2006, 17:00

Dennoch gilt: bei reinen Lesezugriffen, kann man sich per Kopie den Lock sparen.
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

DigitalDream

Frischling

  • »DigitalDream« ist der Autor dieses Themas

Beiträge: 66

Beruf: Entwickler

  • Private Nachricht senden

20

21.11.2006, 17:27

Da hast du natürlich Recht,danke für den Hinweis.

Werbeanzeige