JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.php?sid=dda274fe64cb03d7df75d3ee58a8ce56Medaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

DX9 Vollbild und Alt+Tab

 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> DirectX, OpenGL
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Asto
JLI'ler


Alter: 37
Anmeldedatum: 30.05.2007
Beiträge: 114
Wohnort: Dortmund
Medaillen: Keine

BeitragVerfasst am: 31.05.2007, 13:49    Titel: DX9 Vollbild und Alt+Tab Antworten mit Zitat

Huhu =)
Also wenn ich ein Programm im Vollbild starte ("einfach" PParams.Windowed = !bWindowed oder halt gleich FALSE *g*), dann habe ich das Problem, das wenn ich mini- und wieder maximiere bzw. nach dem drücken von Alt+Tab ich nicht wieder in das Programm komme. Ich sehe dann nur noch das Fenster, aber auch nicht im Vollbildmodus und DirectX ist quasi "weg".

Ich habe versucht, mit der Nachrichtenschleife die maxi- und minimieren befehle abzufangen, und dann nochmal eine WM_PAINT nachricht zu senden zum neu zeichnen des Fensters, aber ohne erfolg.

Reicht PParams.Windowed = !bWindowed einfach nicht, muss ich noch mehr beachten? Oder gehe ich da etwas falsch an?

Flo Smile

Edit: Normalerweise wird WM_PAINT auch automatisch beim maximieren gesendet oder? Das Fenster "verändert" sich ja Question
_________________
"A programmer started to cuss, Because getting to sleep was a fuss, As he lay there in bed, Looping 'round in his head, was: while(!asleep()) sheep++;", Unbekannt


Zuletzt bearbeitet von Asto am 03.06.2007, 10:52, insgesamt einmal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Otscho
Super JLI'ler


Alter: 36
Anmeldedatum: 31.08.2006
Beiträge: 338
Wohnort: Gummibären-Gasse
Medaillen: Keine

BeitragVerfasst am: 31.05.2007, 14:09    Titel: Antworten mit Zitat

Naja soo einfach ist das meines Wissens nicht. Afaik geht da das Direct3D-Device flöten und du musst es neu erstellen.
Es gibt allerdings eine Möglichkeit einen LostDevice wieder herzustellen, wenn du alle Resousen mit D3DPOOL_MANAGED erstellt hast : device->Reset(). Ansonsten neu erstellen.
Hoffe ich konnte dir helfen Cool
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Asto
JLI'ler


Alter: 37
Anmeldedatum: 30.05.2007
Beiträge: 114
Wohnort: Dortmund
Medaillen: Keine

BeitragVerfasst am: 31.05.2007, 14:40    Titel: Antworten mit Zitat

hmm was du meinst, weiss ich. nur will das grad net so Wink

Also ich habe jetzt mal angenommen, 1 Surface, das erstelle ich mit dem Paramter D3DPOOL_MANAGED.

Dann habe ich der Direct3D-Klasse aus dem Buch die public methode
CPP:
void ResetDevice(void);

hinzugefügt.

CPP:
void CDirect3D::ResetDevice(void)
{
   m_lpD3DDevice->Reset(NULL);
}


und WM_PAINT sieht nun so aus:
CPP:
            if(NULL == m_lpD3DDevice)
            {
               Direct3D.ResetDevice();
            }


Hmm irgendwie habe ich das Gefühl, das das zu einfach wäre *gg*

Aber ich habe das Problem, das CreateOffscreenPlainSurface() mit MANAGED nicht funktioniert. das surface wird nicht angezeigt *kopfkratz*

Und: Reset() erwartet einen Parameter. Ich habe mal einfach Null genommen *g* muss da was bestimmtes rein!?
Konnte in der Hilfe zu dem Reset() nix finden Embarassed
_________________
"A programmer started to cuss, Because getting to sleep was a fuss, As he lay there in bed, Looping 'round in his head, was: while(!asleep()) sheep++;", Unbekannt


Zuletzt bearbeitet von Asto am 03.06.2007, 10:52, insgesamt einmal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Jonathan_Klein
Living Legend


Alter: 37
Anmeldedatum: 17.02.2003
Beiträge: 3433
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 31.05.2007, 15:07    Titel: Antworten mit Zitat

Am einfachsten wäre es, die Laderoutine neu aufzurufen. Also alle Grafiken neu laden und so.
Am besten versuchst du, getrennte Laderoutinen zu haben, den beim Vollbild wechsel sollen ja nicht alle Werte wieder auf den Standard gesetzt werden, sondern erhalten bleiben. Es müssen eben nur alle Bilder und sonstige Resosurcen neu geladen und erstellt werden.
Ist ma Anfang gar net so einfach, das gescheit hinzubekommen^^
_________________
https://jonathank.de/games/
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Asto
JLI'ler


Alter: 37
Anmeldedatum: 30.05.2007
Beiträge: 114
Wohnort: Dortmund
Medaillen: Keine

BeitragVerfasst am: 31.05.2007, 15:19    Titel: Antworten mit Zitat

hmm Danke für die Antwort.

Ich habe schlichtweg unter WM_PAINT folgendes eingetragen:
CPP:
            if(NULL == m_lpD3DDevice)
            {
               //Direct3D.ResetDevice();
               Direct3D.Init(hWnd);
            }


Nun muss ich auch nicht die Grafiken neu zeichnen, es bleibt alles so wie vor dem Alt+Tab drücken, aber es passiert garnix beim alt+tab drücken oder maxi und minimieren... sehr dominant o.O
Bzw es passiert schon was. Um das Programm zu beenden muss ich es blind per alt+tab wieder anwählen, da sonst die anderen anwendungen aktiv sind, nur eben mit meinem programm im vordergrund Very Happy

hat was... Wink

Ich vermute mal einfach das WM_PAINT der falsche ort dafür ist Very Happy
Was für ein Ereigniss muss ich abfangen? ist anwählen per alt+tab = maximieren?
_________________
"A programmer started to cuss, Because getting to sleep was a fuss, As he lay there in bed, Looping 'round in his head, was: while(!asleep()) sheep++;", Unbekannt


Zuletzt bearbeitet von Asto am 03.06.2007, 10:52, insgesamt einmal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Christian Rousselle
Site Admin


Alter: 48
Anmeldedatum: 19.07.2002
Beiträge: 1630

Medaillen: Keine

BeitragVerfasst am: 31.05.2007, 15:29    Titel: Antworten mit Zitat

Das mit dem WM_PAINT wird so nicht funktionieren. Lass da am besten die Finger von. Gucke für den Anfang, was die Present() Methode zurückgibt. Die zeigt an, ob sich das Device im Lost-Zustand befindet. In diesem Fall muss du alle "flüchtigen" Ressourcen (und das Device) neu anlegen. Wenn du soweit bist, sollte es erstmal gehen. Es gibt aber noch ein paar andere Dinge zu beachten - such mal im Forum, ich meine da sollte was zu stehen...

C.


Zuletzt bearbeitet von Christian Rousselle am 31.05.2007, 19:33, insgesamt einmal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
51m0n
JLI'ler


Alter: 33
Anmeldedatum: 06.01.2006
Beiträge: 167
Wohnort: Erkelenz
Medaillen: Keine

BeitragVerfasst am: 31.05.2007, 15:33    Titel: Antworten mit Zitat

Wenn das Device verloren geht, z.B. wenn du Alt+Tab drückst ist der Zeiger auf das Device nicht NULL.

Ob das device verloren gegangen ist kannst du mit IDirect3DDevice9::TestCooperativeLevel checken oder wenn dir die Methode IDirect3DDevice9::Present D3DERR_DEVICELOST zurückgibt.

Dann musst du das device resetten. Entweder mit Reset() aber als Parameter nicht NULL angeben sondern einen Zeiger auf die PresentParameters-Struktur, oder du erstellst es ganz neu.

Außerdem musst du auch die ganzen Texturen neu laden, es sei denn sie sind im D3DPOOL_MANAGED, aber darauf kann man leider auch nicht immer vertrauen. Also am besten alles neu laden.

MfG 51m0n
_________________
Teigwaren
heißen Teigwaren,
weil sie früher einmal Teig waren
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Asto
JLI'ler


Alter: 37
Anmeldedatum: 30.05.2007
Beiträge: 114
Wohnort: Dortmund
Medaillen: Keine

BeitragVerfasst am: 31.05.2007, 15:35    Titel: Antworten mit Zitat

Hmm ich habs grad mal gelöst. N bissl anders :X

Is das ok so oder gibt es da n Haken, der mir noch nicht aufgefallen ist?

Und zwar: obiges raus aus WM_PAINT, dann fange ich WM_SIZE ab und überprüfe per wParam ob SIZE_RESTORED dabei ist. Wenn ja: neu initialisieren ^^

CPP:
      case WM_SIZE:
               switch(wParam)
               {
               case SIZE_RESTORED:
                     if(NULL == m_lpD3DDevice)
                     {
                        //Direct3D.ResetDevice();
                        Direct3D.Init(hWnd);
                     }

                  break;
               }
            break;


MSDN -> (sau langer Link)

EDIT: Wobei ich jetzt nach dem Beenden ne Zugriffsverletzung angezeigt bekomme, im DebugModus... hmm Very Happy egaaaal? *gg*
Kann das daran liegen, das ich das einfach neu initialisiere und vorher net freigebe? hmm *tüftel*

EDITH: Hmm die Zugriffsverletzung is bei dmusic.dll *kopfkratz* (habe noch musik drinnen)
_________________
"A programmer started to cuss, Because getting to sleep was a fuss, As he lay there in bed, Looping 'round in his head, was: while(!asleep()) sheep++;", Unbekannt


Zuletzt bearbeitet von Asto am 03.06.2007, 10:52, insgesamt einmal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
DirectXer
Dark JLI'ler



Anmeldedatum: 05.02.2005
Beiträge: 1201
Wohnort: Köln
Medaillen: Keine

BeitragVerfasst am: 31.05.2007, 17:25    Titel: Antworten mit Zitat

werden denn in der Init() Funktion die Res. erst geprüft und released bevor sie neu erstellst? Ansonsten könnte es MemLeaks o.ä. geben. Wenn nicht, soltlest du vor Direct3D.init noch eine release Methode aufrufen die die Res. wieder freigibt

Gruß DXer
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Fallen
JLI MVP
JLI MVP


Alter: 40
Anmeldedatum: 08.03.2003
Beiträge: 2860
Wohnort: Münster
Medaillen: 1 (mehr...)

BeitragVerfasst am: 31.05.2007, 18:21    Titel: Antworten mit Zitat

51m0n hat Folgendes geschrieben:

Außerdem musst du auch die ganzen Texturen neu laden, es sei denn sie sind im D3DPOOL_MANAGED, aber darauf kann man leider auch nicht immer vertrauen. Also am besten alles neu laden.
MfG 51m0n


Wo bitte treten bei managed Texturen nach dem DeviceLost Probleme auf? Ich mache schon viel kranken mist mit den Resourcen und dem Device (Workstationlock+Ruhestandsmodus) aber damit hatte ich noch nie Probleme Wink

Zitat:
CPP:
case WM_SIZE:
               switch(wParam)
               {
               case SIZE_RESTORED:
                     if(NULL == m_lpD3DDevice)
                     {
                        //Direct3D.ResetDevice();
                        Direct3D.Init(hWnd);
                     }

                  break;
               }
            break;


Na DAS nenne ich mal krank Wink

Versuche es mal so:

Vor dem Rendern testen ob alles ok ist:
CPP:
HRESULT lh_Result = this->get_Device()->TestCooperativeLevel();
if (lh_Result == D3DERR_DEVICELOST)
{
  this->Reset(); 
}

if (!::IsIconic(hwnd))
  this->Rendern(...);



CPP:
void foo::Reset()
{
  // vernichte: rendertargets, depthstencilbuffer, swapchains, stateblocks, DEFAULT pool resourcen
  ...

  // Device fenster wieder hervorheben
  if (::IsIconic(hwnd))
    ::ShowWindow(hwnd, SW_RESTORE);

  HRESULT Result = D3DERR_DEVICELOST;
  // solange warten bis wir unser Device resetten können
  while (Result == D3DERR_DEVICELOST)
    Result = this->get_Device()->TestCooperativeLevel();

  // device resetten, in myPresentParam haben wir unsere neuen deviceparameter drin wenn wir zb einen Fullscreenswitch durchführen oder das fenster resizen wollen
  Result = this->get_Device()->Reset(&myPresentParam);
  if (FAILED(Result))
  {
    // Fehler, irgendetwas wurde vergessen zu vernichten
    ...
  }

  // stelle wenn nötig diverse renderstates, etc wieder her
  ...

  // erstelle alles zuvor vernichtete neu
  ...
}


Es gibt dort sicher einiges zu verbessern aber es dürfte sicher zeigen was gemeint ist.

mfg Mark
_________________
"I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse."
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
51m0n
JLI'ler


Alter: 33
Anmeldedatum: 06.01.2006
Beiträge: 167
Wohnort: Erkelenz
Medaillen: Keine

BeitragVerfasst am: 31.05.2007, 19:02    Titel: Antworten mit Zitat

Bei dir klappt das immer?
Bei mir hab ich da irgendwie sehr oft Probleme mit. Die Texturen werden dann nach dem erfolgreichem reset nicht mehr angezeigt, als wären sie nicht im managed pool. Ich musste die immer neu laden..
_________________
Teigwaren
heißen Teigwaren,
weil sie früher einmal Teig waren
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Christian Rousselle
Site Admin


Alter: 48
Anmeldedatum: 19.07.2002
Beiträge: 1630

Medaillen: Keine

BeitragVerfasst am: 31.05.2007, 19:06    Titel: Antworten mit Zitat

Ist zwar etwas Offtopic (MANAGED Texturen), aber ich hatte damit noch nie Probleme und kann mir auch nicht vorstellen, dass das ein generelles Problem ist.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
51m0n
JLI'ler


Alter: 33
Anmeldedatum: 06.01.2006
Beiträge: 167
Wohnort: Erkelenz
Medaillen: Keine

BeitragVerfasst am: 31.05.2007, 19:25    Titel: Antworten mit Zitat

Ui das ist jetzt aber peinlich Embarassed
Dass die Texturen nicht angezeigt wurden lag nicht an den managed Texturen sondern an dem unmanaged vertex buffer, den ich beim testen auch außversehen auskommentiert hab. Embarassed
Ich hasse es wenn man was beweisen will, aber einem dann auffällt, dass man sich vertan hat, sodass man am Ende unrecht hat -.-

Naja hier mit ziehe ich meine Aussage zurück Smile
managed texturen 4 ever

aber nun back 2 topic!
_________________
Teigwaren
heißen Teigwaren,
weil sie früher einmal Teig waren
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Asto
JLI'ler


Alter: 37
Anmeldedatum: 30.05.2007
Beiträge: 114
Wohnort: Dortmund
Medaillen: Keine

BeitragVerfasst am: 31.05.2007, 20:50    Titel: Antworten mit Zitat

Embarassed
Vielen Dank Fallen Very Happy
_________________
"A programmer started to cuss, Because getting to sleep was a fuss, As he lay there in bed, Looping 'round in his head, was: while(!asleep()) sheep++;", Unbekannt
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
fast hawk
Senior JLI'ler



Anmeldedatum: 15.07.2005
Beiträge: 237
Wohnort: Freiburg
Medaillen: Keine

BeitragVerfasst am: 06.06.2007, 17:23    Titel: Antworten mit Zitat

Diese Methode geht aber nur wenn die Nachrichtenschleife unabhänig läuft ansonsten muss man es so machen.

http://www.online-tutorials.net/faq/directx-was-mache-ich-bei-onlostdevice;-alt+strg+entf-minimieren/tutorials-t-51-87.html
(ich erlaube mir mal auf diese turoial hinzuweißen)

gruß fast hawk
_________________
Jetziges Projekt: The Ring War
Status: 40%
-----------------------------------
Nicht weil es schwer ist, wagen wir es nicht, sondern weil wir es nicht wagen, ist es schwer.
--
Lucius Annaeus Seneca (4)
röm. Philosoph, Dramatiker und Staatsmann
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> DirectX, OpenGL Alle Zeiten sind GMT
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.


Powered by phpBB © 2001, 2005 phpBB Group
Deutsche Übersetzung von phpBB.de

Impressum