MDX: Fullsreen Modus
-
Hallo,
ich hab eine kleine fullscreen Anwendung geschrieben, allerding
wenn ich die Windowstaste, oder Alt+Tab drücke wird ein LostDevice
ausgelöst, wie kann ich das abfangen?Danke schonmal.
-
ich glaube es gibt einen extra abschnitt in der doku die das behandelt. bei c++ musst du danach alle nicht managed resourcen neu initialisieren.
-
Auch bei MDX müssen Nicht-Managed Ressourcen vor einem Device-Reset freigegeben werden. Ein Grund mehr DX10 zu lieben.

Zum DeviceLost gibt es hier einen guten Artikel:
http://www.jkarlsson.com/Articles/devicelost.asp
-
Ok, abgefangen hab ich es, nur auf welchen event soll ich reagieren,
wenn ich die Windowstaste oder ähnliches drücke, verliert das Fester den Fokus oder? Dann würd ich da ansetzen, und wenn der Fokus wieder aktiv is, würd ich neu
initialsieren.Wäre das ok?
-
adonis schrieb:
Ok, abgefangen hab ich es, nur auf welchen event soll ich reagieren,
wenn ich die Windowstaste oder ähnliches drücke, verliert das Fester den Fokus oder? Dann würd ich da ansetzen, und wenn der Fokus wieder aktiv is, würd ich neu
initialsieren.Wäre das ok?
In der Doku steht es genau beschrieben. Schau in die C++-Doku, die ist ausführlicher und das Verhalten ist nicht anders. Du musst den CooperativeState prüfen und bei DeviceNotReset neu initialisieren.
-
Ok, danke werd ich machen.
-
Habe eine Seite dazu gefunden, vielleicht hilft die auch anderen.
http://www.chadvernon.com/blog/tutorials/managed-directx-2/responding-to-a-lost-device/
-
ok, ich hab das nun so gelöst, funktionieren tut es.
kann man das so lassen, oder ist es eher unpraktisch?public void Render() { if (form.WindowState == FormWindowState.Minimized|| device == null) { return; } if (deviceLost == false) { device.Clear(ClearFlags.Target, clor, 1.0f, 0); device.BeginScene(); try { if (mesh != null) { DrawModel(); } } catch (DirectXException e) { MessageBox.Show(e.ToString()); } device.EndScene(); try { device.Present(); } catch (DeviceLostException) { System.Threading.Thread.Sleep(50); device.Dispose(); deviceLost = true; } } if (deviceLost == true) { RestoreDevice(); } }private void RestoreDevice() { InitGraphic(Handle, clor, Width, Height, windowed); ModelLoader(filename, modelname); CreateLight(); deviceLost = false; }
-
Wo prüfst du auf DeviceNotReset? Erstellst du das Device jedesmal komplett neu? Kann man schon machen, ist aber normal nicht nötig.
-
Zur Zeit überprüfe ich es nicht und erstelle es immer neu, ja.
mhhh.
Also ich hätte zur Verfügung
public bool CheckCooperativeLevel(out int result)und
resultcode.xxxIch könnte dann mit switch case dann für jeden Fall, sagen was er machen soll.
Für DeviceLost müsste ich warten bis DeviceNotReset eintritt und es dann resetten,
verstehe ich das richtig?Dann könnte ich es mir sparen das device immer neu zu erstellen.
-
Ja. Im Present kriegst du das DeviceLost als Exception, ab da solltest du nichts mehr rendern, sondern immer wieder den cooperative level prüfen. Sobald dieser device not reset ist, kannst du resetten.
-
ok, danke schön.