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

1

20.11.2006, 18:44

Wozu eine eigene Klasse VertexBuffer?

Hi,

ich habe immer noch nicht ganz verstanden was der Vorteil einer eigenen VertexBuffer klasse sein soll.
Man hat doch bereits die Vertexbuffer instanz von DirectX und genügend Methoden zur Verfügung um den Buffer zu aktualisieren,und wieder Lock und Unlock aufzurufen.

Wozu also nochmal DirectX wrappen?
Und was genau soll jetzt der Trick an der Bufferkopie sein,ausser das man nun zusätzlich Speicherplatz angelegt hat?

Ich habe die Abschnitte im Buch nun zig mal durch,aber habe die Begründungen immer noch nicht verstanden.
Vielleicht klappts ja hier ,durch die ein oder andere Erklärung ...

Black-Panther

Alter Hase

Beiträge: 1 443

Wohnort: Innsbruck

  • Private Nachricht senden

2

20.11.2006, 21:46

Also ich finds angenehmer mit WrapperKlasse. Außerdem bringt die Kopie ordentlich Performance, ohne, dass man sich selbst darum kümmern muss... 1. Kann der Buffer immer mit Discard gesperrt werden (extrem schnell) und 2. wird er nur aktualisiert, wenns notwendig ist...
stillalive studios
Drone Swarm (32.000 Dronen gleichzeitig steuern!)
facebook, twitter

DigitalDream

Frischling

  • »DigitalDream« ist der Autor dieses Themas

Beiträge: 66

Beruf: Entwickler

  • Private Nachricht senden

3

20.11.2006, 23:05

Zitat von »"Black-Panther"«

Also ich finds angenehmer mit WrapperKlasse. Außerdem bringt die Kopie ordentlich Performance, ohne, dass man sich selbst darum kümmern muss... 1. Kann der Buffer immer mit Discard gesperrt werden (extrem schnell) und 2. wird er nur aktualisiert, wenns notwendig ist...


Hi blackpanther,

danke für deine Antwort.

Aber kannst du das mit der Performance auch begründen?

Und der Vertexbuffer würde auch ohne Klasse nur dann aktualisiert wenn es notwendig wäre ...
Ob du Lock in einer Klasse aufrufst ,Daten anpasst,und wieder Unlock aufrufst oder ohne Klasse bleibt doch gleich.

Mir ist schon klar,dass etwas dahinter steckt,nur hab ich es noch nicht kapiert ...

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

4

21.11.2006, 12:26

was ist, wenn du dich plötzlich entschließen solltest, opengl zu verwenden?

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

5

21.11.2006, 12:53

Folgende 2 Szenarios:
1. Angenommen wann wollte überprüfen, welche Vektoren eines Modells einen gewissen y-Wert unterschreiten. Ohne eine Kapselung müsste man den Buffer also sperren, die Werte auslesen, die Werte auf die Bedingung überprüfen und den Buffer wieder entsperren. Mit einer Kapselung, die eine Kopie des Buffers hat muss man den Buffer nicht mehr sperren oder gar auslesen.

2. Man möchte bestimme Vertices ändern. Ohne Kapselung muss der Buffer gesperrt, die Daten ausgelesen, die Daten geändert und der Buffer wieder entsperrt werden. Mit einer Kapselung kann man es in folgender Reihenfolge machen: Daten ändern, Buffer sperren, komplett rein kopieren und der Buffer wieder entsperrt werden. Das komplette Kopieren ist schneller als der einzelne Zugriff und die Zeit die der Buffer gesperrt ist, wird möglichst klein gehalten.

Gegen die Kopie spricht hingegen, dass natürlich nicht sicher gestellt ist, dass die Daten aus der Kopie, denen aus dem Buffer wirklich gleichen.
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

6

21.11.2006, 13:38

Zitat von »"dot"«

was ist, wenn du dich plötzlich entschließen solltest, opengl zu verwenden?


Daran habe ich auch schon gedacht.

Aber die Unterschiede zwischen OpenGL und DirectX in Hinsicht auf einen
VB sind so gross,dass ein Interface aus dem unterschiedliche Implementierungen abgeleitet werden oder eine gemeinsame Klasse nur wenig Sinn ergeben würden.

Weil die Gemeinsamkeiten viel zu gering sind, weder die Parameter für einen VertexBuffer noch das Speicherhandling selbst.

Ich finde die Verwaltung eines VertexBuffers ist zu speziell um sie zwischen OpenGL und DX zu vereinheitlichen.


Wie dem auch sei,es geht mir hier nicht um Interface design,sondern wo nun der technische oder Performance vorteil dieser Klasse sein soll.
David hat sich natürlich was sinnvolles dabei gedacht und auch versucht im Buch zu erklären,nur habe ich seine Begründungen noch nicht verstanden ...

DigitalDream

Frischling

  • »DigitalDream« ist der Autor dieses Themas

Beiträge: 66

Beruf: Entwickler

  • Private Nachricht senden

7

21.11.2006, 14:02

Zitat von »"Nox"«

Folgende 2 Szenarios:
1. Angenommen wann wollte überprüfen, welche Vektoren eines Modells einen gewissen y-Wert unterschreiten. Ohne eine Kapselung müsste man den Buffer also sperren, die Werte auslesen, die Werte auf die Bedingung überprüfen und den Buffer wieder entsperren. Mit einer Kapselung, die eine Kopie des Buffers hat muss man den Buffer nicht mehr sperren oder gar auslesen.

2. Man möchte bestimme Vertices ändern. Ohne Kapselung muss der Buffer gesperrt, die Daten ausgelesen, die Daten geändert und der Buffer wieder entsperrt werden. Mit einer Kapselung kann man es in folgender Reihenfolge machen: Daten ändern, Buffer sperren, komplett rein kopieren und der Buffer wieder entsperrt werden. Das komplette Kopieren ist schneller als der einzelne Zugriff und die Zeit die der Buffer gesperrt ist, wird möglichst klein gehalten.



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.

Warum Speicher für einen zusätzlichen Buffer verbraten,nur wegen lock unlock?

Mir fehlt dazu irgendwie der Praxis bezug...

Wenn ich ein 3D modell lade,dann ist es komplett und ich schiebs in den VB und dann wird die Szene gerendert.
Wenn sich nun was ändert,wird das so oder so gesammelt ,ein VB gelocked und angepasst danach entsperrt und wieder neu gerendert.

Ich steh auf dem Schlauch. :(

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

8

21.11.2006, 14:23

Naja das hat schon eine gewisse Logik. Es macht einen Unterschied, ob man nun jedesmal den Laufburschen losschickt, um die Akte XYZ zu holen, was immer wieder Zeit braucht, oder ob man sich eine Kopie vorsorglich angelegt hat und daher das dauernde hin und her wegfällt.
Weniger bildlich, mehr praktisch:
Für jeden Lock bzw. Unlock jagst du alle Daten über den BUS. Wenn man das oft genug macht wird der PC schon merklich langsamer im Darstellen. Es sind ja auch nicht nur die Buffer, die über den BUS müssen ;)
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.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

9

21.11.2006, 14:28

vor allem wenn der laufbursche die akte jemandem, der gerade damit arbeiten wollte, wegnimmt, nachdem diese akte die komplette hierarchie vom chef runter durchlaufen hat, um sie zu dir zu bringen, damit du sie verändern kannst und sie nacher wieder zum chef muss bevor der arme andere mit seiner arbeit wieder von vorn anfangen darf...

das nennt man dann auch pipeline stall und is nicht so der bringer wenns um fps geht ;)

DigitalDream

Frischling

  • »DigitalDream« ist der Autor dieses Themas

Beiträge: 66

Beruf: Entwickler

  • Private Nachricht senden

10

21.11.2006, 14:37

Ja,dass ist mir schon klar.

Aber wenn sich ein Modell ändert und dargestellt werden soll wird auch nur einmal Lock und Unlock aufgerufen und fertig.

Warum sollte man den Buffer mehrfach aktualisieren wollen?

Ein SetVertices oder ein SetVertex ruft man auch nur einmal auf.
Man weiss doch schliesslich exakt wie das Modell bei einer Veränderung gezeichnet werden soll...

Warum also mehrfach den Vertexbuffer ändern wollen?
Man macht doch einmal alle notwendigen Änderungen am Modell,ob mit oder ohne Klasse zwischen dem Lock und Unlock und dann wird gerendert.

Sobald es also nötig wird den VB zu aktualisieren möchte man das doch auch rendern ...
Also macht man doch jede Änderung immer nur einmalig zwischen einem Lock und Unlock.

Werbeanzeige