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

1

19.06.2011, 18:32

Umsetzung eines globalen D3D9-Devices

Guten Tag liebe Com :)

Der Threadname und die Frage wird wohl sehr schlecht zu verstehen sein, aber ich versuch es mal :P
Also mein Problem ist, dass ich versuche ein globales IDirect3DDevice9 zu erstellen, in Form einer Klasse,
die ich einfach mal GraphicsDevice nenne. Aber ich will nicht, dass die Instanz des Devices immer existiert,
sondern nur dann wenn es auch wirklich benötigt wird. Mein erster Gedanke, war da einfach eine Liste mit allen
Direct3D-Ressourcen zu erstellen und wenn die Liste leer ist, das Device zerstört wird.
Da ist aber leider ein kleines Problem, nämlich, dass es ja noch die beiden Klassen DisplayMode und GraphicsContext,
die intern eine SwapChain besitzt, gibt. Und die haben ja nichts mit einer Ressource zu tun bzw. DisplayMode soll eine
statische Methode haben, die alle verfügbaren Modi zurückgibt.
Die eigentliche Frage ist nun: Wie würdet ihr so etwas umsetzen?
Ich habe echt ein Brett vorm Kopf :(

Danke

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

2

19.06.2011, 20:07

Warum würdest du so etwas denn tun wollen?
@D13_Dreinig

3

19.06.2011, 20:10

Der Grund für all das ist, dass ich in mehere Fenster rendern will.
Deshalb soll jedes Fenster eine SwapChain bekommen.
Ein anderer Vorteil wäre, dass man so nicht jede Textur doppelt und dreifach laden muss, weil es ja nur ein Device gibt.
Also ich denke mal das ist sinnvoll.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

4

19.06.2011, 20:14

Erm... geht das unter DX? In OpenGL geht das nämlich nicht, so weit ich weiß. Da können Texturen nicht geshared werden.
Mir ist aber unklar, warum Du (wenn es schon so sein soll) den Release von Devices nicht an Deinen Ressourcen-Manager koppelst.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »BlueCobold« (19.06.2011, 20:27)


5

19.06.2011, 21:14

Erm... geht das unter DX? In OpenGL geht das nämlich nicht, so weit ich weiß. Da können Texturen nicht geshared werden.

Ja das meinte ich eigentlich. Da ich die gleiche Textur für jedes Device laden muss.

Mir ist aber unklar, warum Du (wenn es schon so sein soll) den Release von Devices nicht an Deinen Ressourcen-Manager koppelst.

Weil ich keinen Ressourcen-Manager in meinem Framework habe ^^

Noch mal zur eigentlichen Frage: Ich dachte, dass es besser wäre nur ein Device zu haben und dann einfach mehere SwapChains oder ist das falsch?
Oder ist es nicht ganz klar was ich will?

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

6

19.06.2011, 21:32

Das muss dir jemand anderes beantworten. Unter OpenGL ginge sowas jedenfalls nicht - nicht so weit ich weiß zumindest.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

7

19.06.2011, 21:38

Erstmal: Globales Device ist imo eine schlechte Idee. Alles was ein Device braucht bekommt eins übergeben und fertig.

Erm... geht das unter DX? In OpenGL geht das nämlich nicht, so weit ich weiß. Da können Texturen nicht geshared werden.

Klar doch, sogar schon länger als in D3D (entgegen dem Namen kannst du damit nicht nur Display Lists sharen sondern alles Mögliche: Texturen, Buffer, ...) ;)

Noch mal zur eigentlichen Frage: Ich dachte, dass es besser wäre nur ein Device zu haben und dann einfach mehere SwapChains oder ist das falsch?
Oder ist es nicht ganz klar was ich will?

Wenn du in mehrere Fenster rendern willst gibts in D3D9 prinzipiell mal 3 Möglichkeiten:
  • Present() (3ter Parameter gibt das Zielfenster an)
  • Eine SwapChain pro Fenster
  • Mehrere Devices
Was am Besten ist hängt davon ab was genau du willst (mehrere eigenständige Fenster? mehrere Viewports? mehrere komplette Bildschirme? Oder reichen vielleicht mehrere Viewports im selben Fenster?). Prinzipiell würd ich mir ein Device Objekt pro Grafikkarte halten, alles weitere kannst du mit merheren SwapChains auf diesem Device erledigen. Resource Sharing gibts ab D3D9Ex.

Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von »dot« (19.06.2011, 21:45)


BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

8

19.06.2011, 21:45

Erm... geht das unter DX? In OpenGL geht das nämlich nicht, so weit ich weiß. Da können Texturen nicht geshared werden.

Klar doch, sogar schon länger als in D3D (entgegen dem Namen kannst du damit nicht nur Display Lists sharen sondern alles Mögliche: Texturen, Buffer, ...) ;)

wgl-Funktionen sind doch aber kein OpenGL-Standard, sondern nur eine Windows-Erweiterung oder sehe ich das falsch? Gibt es Äquivalente auch unter MacOS oder Linux?
Edit: Jap, gibt es. :thumbup:
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

9

19.06.2011, 21:47

wgl-Funktionen sind doch aber kein OpenGL-Standard, sondern nur eine Windows-Erweiterung oder sehe ich das falsch?

Der OpenGL Standard kümmert sich um solche Dinge nicht. Von einer Erweiterung kann man nicht reden, wgl ist einfach die API mit der man in Windows einen OpenGL Kontext erzeugen kann. Die Initialisierung von OpenGL ist völlig plattformabhängig. Das Äquivalent für X11 basierte Systeme wär z.B. glX.

Gibt es Äquivalente auch unter MacOS oder Linux?

Natürlich.

10

19.06.2011, 21:48

Erstmal: Globales Device ist imo eine schlechte Idee. Alles was ein Device braucht bekommt eins übergeben und fertig.

Prinzipiell würd ich mir ein Device Objekt pro Grafikkarte halten, alles weitere kannst du mit merheren SwapChains auf diesem Device erledigen

Widerspricht sich das nicht?
Oder meinen wir nicht das gleiche?
Meine Idee war ja, wie oben beschrieben, ein Device für das ganze Framework zu halten, da es ja auch nur eine Grafikkarte gibt.
Und dann sollen alle Texturen, Vertexbuffer, Indexbuffer etc. mit diesem Device erstellt werden.
Jedes Fenster des Frameworks hat dann eine Swapchain.

Werbeanzeige

Ähnliche Themen