Vollbildmodus nicht beständig,..... oder so....
-
Hi ich bin es wieder^^ Ich wusste nicht genau, wie ich den Thread nennen sollte.
Mein Problem besteht dieses Mal darin, dass ich zwar im Vollbild Modus starten kann, aber wenn ich das Fenster wechsel und zu meinem Programm zurückkehren möchte, dann baut sich der Vollbildmodus nicht mehr auf. Dann habe ich nur noch ein Fenster mit weißem Hintergrund und dem Fenstertitel, aber es geschehen keinerlei Grafische ausgaben mehr und, wie gesagt, der Vollbildmodus baut sich nicht wie erwünscht wieder auf.
Kann es sein, das das mit den Flags zusammen hängt, die ich beim erzeugen des Fensters und der Initialisierung des Direct3D übergebe, oder wird beim zurückkehren irgend ein Signal gesendet, auf das ich reagieren muss?
Hmmm, was kann ich als Hintergrund informationen geben...
Das Fenster hat eine Auflösung von 1024x786@32, mein Desktop hat allerdings die Auflösung 1440x900(widescreen)@32, nur falls es etwas mit dem umstellen zu tun haben kann.
Derzeit übergebe ich als Fenstereigenschaften noch WS_OVERLAPPEDWINDOW und WS_VISIBLE, aber ich werde mir zumindest den Rahmen demnächst noch weg flaggen.
Ansonsten fällt mir grad nichts mehr ein, was an Hintergrundinfos nützlich sein könnte.
Ich würde mich sehr über Tipps freuen
thx so far
euer Shane
-
Du hast soeben entdeckt dass man (in D3D9) sein Device verlieren kann:
http://msdn.microsoft.com/en-us/library/bb174714.aspx
-
Ok, das hat mir geholfen. Danke. Ich weiß jetzt warum es passiert. Er kann nicht resetten, weil ich ein offscreenplainsurface mit dem flag D3DPOOL_DEFAULT erzeugt habe. und jeder andere Flag sorgt dafür, dass ich den offscreenPlainSurface nicht auf den Backbuffer Stretchen kann-.-
Vielen Dank @dot
Jetzt muss ich mir nur ne alternative einfallen lassen^^
thx
euer Shane
-
Du musst sämtliche Default Ressourcen freigeben, Device resetten und dann Ressourcen neu erstellen...
-
Ich hab grad verständnis probleme damit, wie ich meinem Programm mitteile, dass das Device verloren wurde. das resetten und neu erstellen wird nicht das problem. Sendet Windows ne WM, oder muss ich das kontinuirlich in meiner loop abfragen?
Ich les mich mal tiefer rein...
-
Steht grundsätzlich eh alles dort in der msdn. Device->Present() beispielsweise gibt nen entsprechenden Returncode zurück. Daran merkst du dass das Device lost is. Wenn das passiert musst du alle Default Pool Ressourcen freigeben. Dann kannst du mit IDirect3DDevice9::TestCooperativeLevel() checken ob du das Device resetten kannst (z.B. im WM_ACTIVATE). Wenn ja resettest du es und erzeugst deine Ressourcen neu.
-
Gut, soviel dazu^^ hab mich durch gelesen, danke erstmal für die sehr hilfreichen links, und bin zu dem ergebnis gekommen, dass ich nahezu neu anfangen muss. Hab bisher alles auf der 9er basis gebaut, allerdings empfiehlt es sich wohl eher zumindest mit der 9EX zu programmieren. Meine gesamte device struktur ist noch ohne EX. Liegt daran, dass ich ein ziemlich altes Buch verwendet habe. Ich denke, wenn ich neu anfange wird das in meinem Entwicklungsstadium deutlich einfacher, als wenn ich im alten, nicht sehr schönen, Code rum pfusche. Neu schreiben hilft eh die Methoden kennen zu lernen^.-
Wenn ich mit nem EX Device arbeite brauch ich nichts restoren, dann reicht ein reset des device. Wenn der reset nicht mehr möglich ist, dann muss das Program eh beendet werden.
Danke für deine Hilfe dot.
-
Naja der ganze Ex Kram funktioniert dafür nur auf Windows >= Vista, reines D3D9 hingegen auch auf älteren Plattformen. Wenn du nicht wirklich eines der Ex Features benötigst seh ich keinen Grund D3D9Ex zu verwenden. Und ansonsten könntest du dann auch gleich zu D3D11 wechseln, das ist für Anfänger aber evtl. noch eine Stufe schwieriger als D3D9....
-
Hmm, habe noch viel zu lernen. also ein ex device läuft nur auf >= Vista. gut zu wissen. Dann werde ich mich wohl doch noch etwas mit dem "normalen" 9er device rum schlagen.
In der msdn steht bei Present nur was von D3DERR_DEVICEREMOVED, aber wenn ich dem danach folgenden link entnehmen darf, dass all diese errors zurückgegeben werden können, dann macht das die sache einfacher.
Werd mich morgen als aller erstes damit beschäftigen, meine konzi ist im eimer^^
Danke dot
-
So. Habs soweit, aber irgendwie wills noch nicht so richtig^^ Ich habe Direct3D in eine eigene Klasse gekapselt. Unter anderem enthält diese Klasse jetzt einen protected BOOL m_bDeviceLost, der auf true gesetzt wird, sobalb m_lpD3DDevice->Present(...) den Wert D3DERR_DEVICELOST zurückgibt.
hmmmm...
Da fällt mir doch grad auf, dass das unnötig ist^^ aber egal. Wenn WM_ACTIVATE gesendet wird, dann wird die Methode Direct3D.TryReset() aufgerufen, welche vorerst wie folgt aufgebaut ist:
// Versuche das Device zu retten void CDirectX3D::TryReset() { if(m_bDeviceLost) { HRESULT hr; while(m_bDeviceLost) { hr = m_lpD3DDevice->TestCooperativeLevel(); switch(hr) { case D3DERR_DEVICENOTRESET: m_lpD3DDevice->Reset(&m_PParams); break; default: break; } } } }
Ich habe die Methode noch nicht vernünftig Kommentiert, aber ich denke die Funktionsweise wird deutlich.
Wenn das Device verloren wurde, dann gehe in eine endlosschleife über, welche terminiert wird, .........
ich sehe grad einen fatalen fehler-.- Ein absoluter noob fehler-.- die schleife terminiert nicht ich honk......
-
So, jetzt gibt es keine Probleme mehr.
Abgesehen davon, dass das Programm nach dem Reset nichts mehr anzeigt.
An resourcen hat mein Program nichts, nur das Device, über welches ein Vollbild mit blauem hintergrund angezeigt wird. Muss ich nach dem Reset noch Das Device irgendwie bearbeiten, oder sollte nach erfolgreichem reset alles wieder beim alten sein?
-
Hab den Feheler. Das Device wird nicht resettet, weil TestCooperativLevel() die ganze Zeit nur D3DERR_DEVICELOST zurückgibt, selbst, wenn ich versuche mein Programm via Alt+TAB wieder in den fokus zu ziehen. Eigentlich müsste dann doch D3DERR_DEVICENOTRESET zurückgegeben werden, oder nicht?