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

Peter Bucher

Frischling

  • »Peter Bucher« ist der Autor dieses Themas

Beiträge: 28

Wohnort: Schweiz

Beruf: IT

  • Private Nachricht senden

1

07.02.2007, 11:25

[C# Managed DirectX] DeviceReset bei mehreren Vertexbuffern

Hallo zusammen

Ich habe jetzt schon eine ganze Weile Informationen über dieses Thema im Internet zusammengesucht, wurde aber leider nicht zu 100% schlau.

In den meisten Anleitungen zur Behandlung von DeviceReset, steht, dass man den VertexBuffer neu initialisieren muss, dies natürlich mit Angabe des Vertextypes.
Anschliessend sollte man die Vertexdaten im Eventhandler in den Buffer schieben.

Hört sich alles sehr plausibel an, nur, jedes Beispiel das ich gefunden habe, benutzt ein VertexBuffer und 1 Objekt das dargestellt wird.

Ich habe einen "globalen" VertexBuffer in meiner Applikation definiert und initialisiere diesen in der Render Methode jeweils für meine verschiedenen Darstellungen, neu zu. Mit Angabe verschiedener CustomVertex Typen und anschliessendem füllen.

Ich weiss jetzt nicht ob das der richtige Weg ist, den VertexBuffer zu benutzen.
Desweiteren stosse ich hier auf ein Problem bei der DeviceReset Behandlung.
Da ich innerhalb der Render Methode verschiedene VertexTypen und natürlich auch der Vertexdaten habe, stehe ich hier an.
Ich kann in DeviceReset den VertexBuffer nur einmal initialisieren, bei jeder weiteren Initialisierung würde der Buffer ja überschrieben.

Wie also, ist das korrekt zu handhaben?
Während ich hier so schreibe, kommt mir was in den Sinn... in DeviceReset jeweils nur den ersten Vertexbuffer in der Rendermethode zu initialisieren... scheint mir aber auch nicht die Lösung zu sein, abgesehen davon, dass es jetzt nur ein Gedanke ist.

Danke für eure Meinungen.

edit: Spellcheck
--
Microsoft MVP - Visual Developer ASP / ASP.NET
http://www.aspnetzone.de/blogs/peterbucher/ - Auf den Spuren von .NET

2

07.02.2007, 21:34

Schreib dir am besten eine Klasse die alle Objekte managed. Zudem würde ich pro Objekt einen Vertexbuffer anlegen (nur meine Meinung). Also speicherst du pro Objekt die Quelle (damit das Objekt wieder geladen werden kann), einen vertexBuffer den du wieder anlegen kannst, das Vertexformat und alle sonst benötgten Informationen (Objekttransformationen, Shader, Texturen usw.).

Bei einem ResetDevice kannst du alle Objekte die du so verwaltest der Reihe nach durchgehen und neu anlegen. Selbiges musst du auch mit Texturen usw. machen.

Peter Bucher

Frischling

  • »Peter Bucher« ist der Autor dieses Themas

Beiträge: 28

Wohnort: Schweiz

Beruf: IT

  • Private Nachricht senden

3

08.02.2007, 13:06

Hallo Chris

Danke für deine Antwort.

Zitat von »"chriss"«

Schreib dir am besten eine Klasse die alle Objekte managed.

Scheint mir ein bisschen aufwändig zu sein, ist das wirklich _die_ Lösung?

Zitat von »"chriss"«

Zudem würde ich pro Objekt einen Vertexbuffer anlegen (nur meine Meinung).

Hast du dazu eine Begründung?

Andere Meinungen?
--
Microsoft MVP - Visual Developer ASP / ASP.NET
http://www.aspnetzone.de/blogs/peterbucher/ - Auf den Spuren von .NET

4

08.02.2007, 14:00

DIE Lösung ist es bestimmt nicht, sondern nur eine.

Ich finde es von handling her leichter wenn jedes Objekt seinen eigenen Vertexbuffer hat. Natürlich ist es dann bei der Übertragung zur Graka langsamer wenn du viele Objekte brauchst. Dafür brauchst du dir die Stellen nicht merken wo sich ein Objekt im Vertexbuffer befindet, sondern kannst immer den gesammten Vertexbuffer render.

Da ich immer mehrere Vertexbuffer nehme weiß ich es nicht, aber ist es denn möglich verschiedene Vertexformate in einem Vertexbuffer zu schreiben? Ich glaube zwar schon abe ich weiß es jetzt nicht :D

Also wenn du nur einen VB nehmen willst wäre eine Klasse für die Verwaltung schon nicht schlecht, diese könnte ihn dann (neu) anlegen und freigeben. Zudem könntest du dieser Klasse dann die Daten geben die in den VB sollen und sie werden dann automatisch reingeschoben und du bekommst ein Objekt zurück welches eine Referenz auf den VB, das Format, und die Positionen wo sich das Objekt im VB befindet zurück.
So würde ich es dann machen. Also eine Klasse für die Verwaltung und eine welche ein einzelnes Objekt repräsentiert.

Mir ist gerade noch ein Grund eingefallen der gegen einen einzigen Vertexbuffer spricht. Wenn du während des Programmablaufs ständig neue Objekte nachlädst oder zerstörst könnte das Handling mit einem VB sehr umständlich und eventuell sogar langsamer werden. Denn es kann schnell passieren das dein VB fragmentiert. Defragmentieren wäre zwar möglich kostet aber viel Zeit und Verwaltungsaufwand (Positionsdaten anpassen). udem müsstest du den kompletten VB nach jeder Änderung komplett übertragen, auch wenn du viele Objekte davon nicht brauchst.

Solltest du pro Level (oder was auch immer) eine Konstante Anzahl an Objekten haben wäre ein einziger Vertexbuffer besser da du ihn nur beim Erstellen an die Graka übergeben musst.


Also kurz zusammengefasst:
Konstante Objekte pro Level ect. -> Ein Vertexbuffer
Häufige Änderung der Objektzahl -> Ein Vertexbuffer pro Objekt/Gruppe

Werbeanzeige