Vollbildmodus nicht beständig,..... oder so....



  • 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?


Anmelden zum Antworten