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

Mind

Treue Seele

  • »Mind« ist der Autor dieses Themas
  • Private Nachricht senden

1

14.09.2004, 21:01

Alt + Tab -> DirectX Resourcen

Im Buch steht ja ganz kurz drin das man nach alt + tab bei Vollbildmodus danach alle Resourcen wieder neuladen sollte, da DirectX da Probleme hat.

Jetzt frag ich mich ganz naiv was hat denn da DirectX für Probleme? Was läuft da genau ab?
Im Buch steht auch was das man sie wieder herstellen könnte dies aber schwer sei, wie funktioniert das? Denn alles neu aufzubauen bei nen großen Spiel mit vielen 3D Objekten und villeicht selbstberechten Resourcen wäre wohl ein alt + tab wechsel nicht mehr machbar es sei den ein paar Minuten warten wäre verkraftbar isses aber net ;-)

Patrick

Alter Hase

Beiträge: 1 264

Wohnort: Düren

Beruf: Fachinformatiker für Anwendungsentwicklung

  • Private Nachricht senden

2

14.09.2004, 21:38

Naja fragen wir mal so:
Braucht DirectX die Resourcen, wenn das Programm minimiert ist? Ich denke mal nicht, drum schmeißt Windows alle Daten beim Minimieren die in den Buffern sind raus, da für anderen Anwendungen die Resourcen eher gebraucht werden.

Das mit dem Restore steht im Buch drine :) Bei OpenGL gibt es so ein ähnliches Phänomän, da muss man alles von Hand freigeben und wieder neu laden :) Ist aber auch nichts großartiges :)

Mind

Treue Seele

  • »Mind« ist der Autor dieses Themas
  • Private Nachricht senden

3

14.09.2004, 22:31

ok das heißt das er grundsätzlich alle resourcen wieder freigibt?
hab irgendwie in erinnerung das es nur manchmal oder so passiert.
ok dann bleibt natürlich nichts anderes übrig als alles wieder neu zuladen is natürlich ätzend ...

hm das auto login scheint noch nicht zu funktionieren...

Patrick

Alter Hase

Beiträge: 1 264

Wohnort: Düren

Beruf: Fachinformatiker für Anwendungsentwicklung

  • Private Nachricht senden

4

14.09.2004, 22:37

Hi,

es gibt natürlich noch die Funktion Restore von Deinen Interfaces, jedoch das Funktionieren hing glaub ich davon ab, welche Flags Du beim erstellen des Objektes gesetzt hast.

Bei einem IDirectDrawSurface musste man nur Restore bei DDERR_SURFACE_LOST aufrufen und fädisch ist.

Ob das jetzt auch mit Vertex- und IndexBuffer funktioniert weiß ich bei Gott nicht ;D Wenns um OpenGL geht kann ich's Dir sagen, aber DX? nee net mein Gebiet :help:

- Patrick

5

14.09.2004, 23:16

Bis jetzt hatte ich da noch keine Probleme. Was aber auch daran liegt das ich mein Programm pausieren lasse. Sollte man jedoch noch weiter rendern, kann es zu einem verlust kommen. ie gesagt hatte ich noch nicht.

Aber ein Restore ist auch nicht so wild. Z.B. bei einem VertexBuffer, werden hier die Daten im Heap temporär gespeichert und die dann eben schnell wieder in den d3d vb zu kopieren ist nun auch nicht so viel arbeit. Das selbe kann man auch mit den Texturen machen. Der rest ist eh im Heap und geht damit auch nicht verloren.

Ich denke wenn man das kapselt und dann in seiner Kapselung eine Rstore Funktion einbaut, ist bei einem Verlust alles wieder schnell reinitialisiert.
Wichtig! Ich übernehme keinerlei Verantwortung für eventl. Datenverlust oder Schäden am Rechner ;D

Mind

Treue Seele

  • »Mind« ist der Autor dieses Themas
  • Private Nachricht senden

6

15.09.2004, 09:36

danke erstmal für die antworten

das heißt also die daten doppelt halten einmal in der verwaltung und einmal in directx? naja gut dafür geht das laden wieder schnell...

öhm das mit pause hab ich net verstanden? warum sollte directx die resourcen nicht freigeben wenn du ne pause hast?

7

15.09.2004, 15:25

@doppelt:
Bei Meshes ist das sehr vorteilhaft. Vor allem dann wenn man viel ändern muss. Der Zugriff auf den Heap ist einfach schneller als der Zugriff auf eine D3D Resource.

@Pause:
Weil ich das Device nicht nutze. Wenn Windows die Daten beiseite schiebt um Platz su schaffen, dann schieb Windows die Daten auch wieder zurück. Aber in der zwischenzeit wird das Device nicht genutzt und d3d bekommt davon nichts mit.
In dieser Pause verarbeite ich zwar weiterhin Nachrichten, aber zeichnen tu ich nett. Ist ja auch sinnlos ;)
Wichtig! Ich übernehme keinerlei Verantwortung für eventl. Datenverlust oder Schäden am Rechner ;D

Mind

Treue Seele

  • »Mind« ist der Autor dieses Themas
  • Private Nachricht senden

8

15.09.2004, 15:45

hm du willst mir sagen wenn ich bei alt tab also lost focus keine funktionen zum rendern benutze solange er wieder focus bekommt hat man die probleme nicht? hm ich dachte er rendert auch gar net wenn ich zum destkop gewechselt hab?

aber wenn windows sowieos wieder die resourcen zurückschiebt wo ist da nn noch das problem?

9

15.09.2004, 16:06

Zitat

hm du willst mir sagen wenn ich bei alt tab also lost focus keine funktionen zum rendern benutze solange er wieder focus bekommt hat man die probleme nicht?
Wie es scheint nicht. Wie gesagt ich mach es immer so und hatte noch nie Probleme damit gehabt.

Zitat

hm ich dachte er rendert auch gar net wenn ich zum destkop gewechselt hab?
Wenn du ihm sagst er soll rendern dann macht er das auch. Egal ob das Fenster nun sichtbar ist oder nett. Die Programmschleife wird ja weiterhin ausgeführt.

Zitat

aber wenn windows sowieos wieder die resourcen zurückschiebt wo ist da nn noch das problem?
Das Problem ist wohl, wenn Windows die Resourcen bei seite schiebt und man dann darauf zugreifen will, keine Resourcen da sind. Ergebnis: Eine hübsche Fehlermeldung :)
Sicher ist, wenn (müste ich mal nachlesen) Windows die Resourcen beiseite schiebt, schiebt Windows die auch wieder zurück.

Da es aber Sinnlos ist auf einen Screen zu rendern den man nicht sieht, kann man den Rendervorgang auch in der zeit stoppen.

Leider kann man sich nicht auf die Nachricht WM_SETFOCUS und WM_KILLFOCUS verlassen :(. Da diese auch dann gesendet werden wenn das Fenster nur in den Hintergrund verschoben wird. Dann aber sollte man ja schon noch rendern. Man muss also einen anderen weg finden um festzustellen ob das Fenster minimiert wurde und wann es wieder maximiert wurde.

[edit die erste]
Hab mal in der MSDN gestöbert und folgende Sachen gefunden:
GetAltTabInfo <- Liefert informationen über das Alt Tab :)
GetWindowPlacement <- In der Struktur WINDOWPLACEMENT gibbet die Member showCmd. Wenn dort SW_SHOWMINIMIZED gesetzt ist, ist das Fenster minimiert. Die Konstante SW_SHOWMAXIMIZED war bei mir immer gesetzt.[/edit]
Wichtig! Ich übernehme keinerlei Verantwortung für eventl. Datenverlust oder Schäden am Rechner ;D

Mind

Treue Seele

  • »Mind« ist der Autor dieses Themas
  • Private Nachricht senden

10

15.09.2004, 17:07

ok habs verstanden danke.

jetzt ist halt die frage wie man das rausbekommt. das wäre dann die beste möglichkeit ohne das man nachladen müsste...

Werbeanzeige