|
JLI Spieleprogrammierung
|
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
|
Verfasst am: 31.05.2007, 13:49 Titel: DX9 Vollbild und Alt+Tab |
|
|
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
Edit: Normalerweise wird WM_PAINT auch automatisch beim maximieren gesendet oder? Das Fenster "verändert" sich ja _________________ "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 |
|
|
Otscho Super JLI'ler
Alter: 36 Anmeldedatum: 31.08.2006 Beiträge: 338 Wohnort: Gummibären-Gasse Medaillen: Keine
|
Verfasst am: 31.05.2007, 14:09 Titel: |
|
|
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 |
|
Nach oben |
|
|
Asto JLI'ler
Alter: 37 Anmeldedatum: 30.05.2007 Beiträge: 114 Wohnort: Dortmund Medaillen: Keine
|
Verfasst am: 31.05.2007, 14:40 Titel: |
|
|
hmm was du meinst, weiss ich. nur will das grad net so
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 _________________ "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 |
|
|
Jonathan_Klein Living Legend
Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 31.05.2007, 15:07 Titel: |
|
|
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 |
|
|
Asto JLI'ler
Alter: 37 Anmeldedatum: 30.05.2007 Beiträge: 114 Wohnort: Dortmund Medaillen: Keine
|
Verfasst am: 31.05.2007, 15:19 Titel: |
|
|
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
hat was...
Ich vermute mal einfach das WM_PAINT der falsche ort dafür ist
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 |
|
|
Christian Rousselle Site Admin
Alter: 48 Anmeldedatum: 19.07.2002 Beiträge: 1630
Medaillen: Keine
|
Verfasst am: 31.05.2007, 15:29 Titel: |
|
|
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 |
|
|
51m0n JLI'ler
Alter: 33 Anmeldedatum: 06.01.2006 Beiträge: 167 Wohnort: Erkelenz Medaillen: Keine
|
Verfasst am: 31.05.2007, 15:33 Titel: |
|
|
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 |
|
|
Asto JLI'ler
Alter: 37 Anmeldedatum: 30.05.2007 Beiträge: 114 Wohnort: Dortmund Medaillen: Keine
|
Verfasst am: 31.05.2007, 15:35 Titel: |
|
|
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 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 |
|
|
DirectXer Dark JLI'ler
Anmeldedatum: 05.02.2005 Beiträge: 1201 Wohnort: Köln Medaillen: Keine
|
Verfasst am: 31.05.2007, 17:25 Titel: |
|
|
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 |
|
|
Fallen JLI MVP
Alter: 40 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 31.05.2007, 18:21 Titel: |
|
|
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
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
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 |
|
|
51m0n JLI'ler
Alter: 33 Anmeldedatum: 06.01.2006 Beiträge: 167 Wohnort: Erkelenz Medaillen: Keine
|
Verfasst am: 31.05.2007, 19:02 Titel: |
|
|
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 |
|
|
Christian Rousselle Site Admin
Alter: 48 Anmeldedatum: 19.07.2002 Beiträge: 1630
Medaillen: Keine
|
Verfasst am: 31.05.2007, 19:06 Titel: |
|
|
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 |
|
|
51m0n JLI'ler
Alter: 33 Anmeldedatum: 06.01.2006 Beiträge: 167 Wohnort: Erkelenz Medaillen: Keine
|
Verfasst am: 31.05.2007, 19:25 Titel: |
|
|
Ui das ist jetzt aber peinlich
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.
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
managed texturen 4 ever
aber nun back 2 topic! _________________ Teigwaren
heißen Teigwaren,
weil sie früher einmal Teig waren |
|
Nach oben |
|
|
Asto JLI'ler
Alter: 37 Anmeldedatum: 30.05.2007 Beiträge: 114 Wohnort: Dortmund Medaillen: Keine
|
Verfasst am: 31.05.2007, 20:50 Titel: |
|
|
Vielen Dank Fallen _________________ "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 |
|
|
fast hawk Senior JLI'ler
Anmeldedatum: 15.07.2005 Beiträge: 237 Wohnort: Freiburg Medaillen: Keine
|
|
Nach oben |
|
|
|
|
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
|