Best practices für die Alt-Tab-Unterstützung in einer DirectX-app?
Beim schreiben von DirectX-Anwendungen, ist es natürlich wünschenswert, zu Unterstützung der Benutzer zur Aussetzung der Anwendung über Alt-Tab in einer Weise, die schnell und fehlerfrei. Was ist das beste set von Praktiken, die für die Gewährleistung dieser? Dinge, die angegangen werden müssen gehören:
- Die besten Methoden, die erkennen, wenn Ihre Anwendung wurde alt-tabbed aus und wenn es eingetroffen ist.
- Was DirectX Ressourcen gehen verloren, wenn der Benutzer die alt-Tab, und die besten Möglichkeiten, um dies zu bewältigen.
- Große Dinge zu tun und Dinge zu vermeiden, die bei Anwendung Architektur für die Zwecke von alt-tab-support.
- Erhebliche Unterschiede zwischen den größeren DirectX-Versionen, wie Sie gelten für die oben.
Interessante tricks und Fallstricke sind auch gut zu hören.
- Die code-sampler link gepostet unten sieht, ausreichend, um zu beginnen mit, so werde ich nur hinzufügen: wir haben festgestellt, dass eine einfache Möglichkeit, zu testen, diese situation ist zum ausführen der app im Fenstermodus und verriegeln Sie den Windows-desktop. Auf diese Weise können Sie leicht testen, das verloren gegangene Gerät die situation während der Ausführung im debugger lokal.
- nicht sicher, warum Sie sind Kommissionierung auf das Ventil. Half-life war eines der ersten Spiele, die ich hatte, haben alt-tab ohne Probleme. Wenn es Probleme sind, es ist wahrscheinlich, weil von DirectX selbst (HL verwendet OpenGL auf mein setup)
- SpliFF, es war das erste Spiel, das Alt-Tab-Probleme, für mich zumindest, dass ich mich erinnern kann. 🙂
- SpliFF: TF2 ist berüchtigt für alt-tab-Probleme. Ich bin mir nicht sicher, ob Sie schon fest, aber einen gemeinsamen für einen Spieler verschwinden, wenn Sie die alt-tabbed, wieder in das Spiel (das hat ewig gedauert - ein anderes problem). Wie in, Sie konnte Sie nicht sehen aber Sie konnte sehen und Sie zu töten. Ich weiß nicht, ob es aufgrund einer Bild-Puffer immer gelöscht und nicht neu geladen, wenn es sein sollte, aber es machte für einige interessante Begegnungen.
- Huh, ich war gar nicht bewusst, das war ein problem. Das einzige Spiel, das ich spielen heute (das hab ich jetzt die Entwicklung auch) hatte nie ein Problem mit alt-tab.
- Früher habe ich TF2 Alt+Tab Probleme, aber die Einstellung "-window -noborder" als Startparameter gelöst, vollständig. Während ich warte, um zu respawnen, ich bin surfen oder sonst etwas tun, und ich hatte noch nie ein problem mit der Grafik von Korruption.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich nehme an, dass du mit C++ für den Zweck meiner Antworten, aber wenn Sie sich leisten können zu verwenden, C#, XNA (http://creators.xna.com/) ist ein ausgezeichnetes Spiel-Plattform, kümmert sich um all diese Probleme für Sie.
1]
Dieser Artikel ist hilfreich für windows-Ereignisse in dem Fenster, Verfahren zu erkennen, wenn ein Fenster verliert oder den Fokus erhält, Sie könnten Griff das auf Ihrem Haupt-Fenster: http://www.functionx.com/win32/Lesson05.htm. Schauen Sie sich auch die Meldung WM_ACTIVATEAPP hier: http://msdn.microsoft.com/en-us/library/ms632614(VS.85).aspx
2]
Graphics device verloren gegangen ist, wenn die Anwendung den Fokus verliert, von full-screen-Modus. Microsoft bietet ein Artikel auf, wie zu handhaben: http://msdn.microsoft.com/en-us/library/bb174717(VS.85).aspx Dieser Artikel hat auch ein verloren gegangenes Gerät tutorial: http://www.codesampler.com/dx9src/dx9src_6.htm
DirectInput kann auch ein Gerät verloren, Fehler-Zustand, hier ist ein link dazu: http://www.toymaker.info/Games/html/directinput.html
DirectSound kann auch ein Gerät verloren, Fehler-Zustand dieser Artikel enthält code, der Griffe: http://www.eastcoastgames.com/directx/chapter2.html
3]
Ich würde das sicher nie deaktivieren Sie die Alt-Tab. Sie wollen wahrscheinlich nur minimale CPU-Last, während die Anwendung nicht aktiv ist, weil der Benutzer wahrscheinlich die Alt-Tabbed, weil Sie wollen, etwas anderes zu tun, also könnte man komplett pausieren Sie die Anwendung oder reduzieren Sie die frames pro Sekunde gerendert. Wenn die Anwendung minimiertes Sie natürlich nicht brauchen, um etwas Rendern, entweder. Nach denken über ein Netzwerk-Spiel, meine beste Lösung ist, dass Sie sollten noch verringern der frames in einer Sekunde gerendert werden, sowie die Menge von Netzwerk-Paketen behandelt, vielleicht sogar wegwerfen viele der Pakete, die zu uns kommen, bis das Spiel wieder aktiviert.
4]
Ehrlich, ich wäre nur kleben zu DirectX 9.0 c (oder DirectX-10-wenn Sie möchten, beschränken Sie Ihre Ziel-Betriebssystem zu Vista und neuere), wenn möglich 🙂
Schließlich, das DirectX-sdk hat zahlreiche tutorials und Beispiele: http://www.microsoft.com/downloads/details.aspx?FamilyID=24a541d6-0486-4453-8641-1eee9e21b282&displaylang=en
Wir es gelöst, indem nicht eine fullscreen-DirectX-Gerät überhaupt - stattdessen verwendeten wir ein Vollbild-Fenster mit der top-die meisten flag zu machen es ausblenden der task-Leiste. Wenn Sie die Alt-Tab aus, dass Sie können entfernen Sie die Markierung und das Fenster minimieren. Die textur-Ressourcen werden am Leben gehalten durch die Fenster.
Jedoch dieser Ansatz nicht behandeln Sie das Gerät verloren Ereignis geschieht aufgrund von "lock-Bildschirm" angezeigt wird, Strg+Alt+Entf, remote-desktop-verbindungen, Benutzer wechseln oder ähnliches. Aber diese müssen nicht behandelt werden, besonders schnell oder effizient (zumindest war das der Fall in unserer Anwendung)
Allen ernstes D3D-apps sollten in der Lage sein zu handhaben, verloren Geräte, da dies ist etwas, das passieren kann, für eine Vielzahl von Gründen.
In DX10 unter Vista gibt es eine neue "Timeout Detection and Recovery" - Funktion, die es Häufig in meiner Erfahrung für Grafik-Geräte zurückgesetzt werden, wodurch ein verloren gegangenes Gerät für Ihre Anwendung. Dies scheint zu sein Verbesserung als Fahrer reifer, aber Sie müssen behandeln es trotzdem.
In DX8 und 9 (und 10?) wenn Sie erstellen Sie Ihre Ressourcen (vertex-und index-buffer und Texturen vor allem) mit D3DPOOL_MANAGED Sie bleiben in den verloren gegangenen Geräten und müssen nicht nachgeladen werden. Dies ist, weil Sie sind gespeichert in der system-Speicher und die DX-runtime-Kopien auf video-Speicher automatisch. Aber es ist eine Leistung die Kosten durch die Vervielfältigung und dies ist nicht empfohlen für sich schnell ändernde vertex-Daten. Natürlich würden Sie Profil zuerst zu bestimmen, ob es ist ein speed-Problem 🙂