2008-11-20 9 views
23

Die Leistung einer Direct3D-Anwendung scheint im Vollbildmodus im Vergleich zum Fenstermodus deutlich besser zu sein. Was sind die technischen Gründe dafür?Warum Direct3D-Anwendung im Vollbildmodus besser funktioniert?

Ich denke, es hat etwas damit zu tun, dass eine Vollbild-Anwendung exklusive Kontrolle für das Display gewinnen kann. Aber warum kann die Anwendung keine ausschließliche Kontrolle für Teil des Bildschirms (d. H. Fenster) und haben die gleichen Leistungsvorteile?

+0

Aus Neugier, haben Sie das auf Vista versucht? Mit DWM aktiviert, erlebte ich die Fenstermodus-Geschwindigkeit auf meinem System in einer XNA-Anwendung eher höher (höher, weil weniger Füllrate benötigt wird, aber der Punkt ist, dass es nicht langsamer ist). – OregonGhost

+0

Ja, ich verwende Vista mit aktiviertem DWM. Ich verstehe auch, dass Vista DWM deaktiviert, wenn eine Vollbildanwendung aktiviert ist, um Ressourcen freizugeben. – smt

+0

Vista deaktiviert DWM nur, wenn die Anwendung inkompatibel ist. Ich habe einige Spiele mit Aero Glass im Fullscreen (sichtbar auf den anderen Monitoren). Obwohl das im Allgemeinen der Fall ist, deaktivieren die meisten Spiele DWM. – OregonGhost

Antwort

23

Hier sind die Klippe Hinweise, wie die Dinge unterhalb arbeiten.

Monitor-Bildschirm muss immer so-ca zugeordnet werden Die Grafikkarte kann nur eine Oberfläche im Videospeicher abtasten.

Wenn die Anwendung Vollbild ist (und alles korrekt eingerichtet wurde, um das Spiegeln zu ermöglichen), ist die primäre Oberfläche nur einer der Backbuffer der Anwendung und wird in jedem Frame zu einem anderen Backbuffer gekippt. Es ist die effizienteste Art, auf dem Bildschirm zu präsentieren, aber es erfordert eine Anwendung, um den gesamten Überwachungsbereich (d. H. Die gesamte primäre Oberfläche) zu besitzen.

Wenn es keine Vollbildanwendung gibt und DWM deaktiviert ist, gehört die primäre Oberfläche dem Betriebssystem, und jede gefensterte Anwendung führt einen Blit vom Anwendungsrückpuffer zu einer primären Oberfläche aus. Dieses Blit benötigt etwas Zeit für die Erstellung von GPUs (sowie Blits aus den anderen Anwendungen, die auf dem Bildschirm sichtbar sind). Es ist also nicht so effizient wie die Vollbilddarstellung. XP hat so funktioniert.

Wenn DWM den Bildschirm erstellt, werden die Dinge noch komplizierter. Hier besitzt DWM die primäre Oberfläche und muss dort Anwendungsfenster zeichnen. Um dies zu ermöglichen, hat jedes Fenster eine zugehörige Oberfläche, die seinen Inhalt enthält, die so genannte Redirection-Oberfläche (die DWM ermöglicht, Fenster-Ghosting, Glaseffekte und all diese guten Dinge zu aktivieren). Jedes Mal, wenn die D3D-Anwendung einen Frame ausgibt, fügt sie einer Umleitungsoberfläche ein Blit hinzu. Auf diese Weise müssen mehrere Blits passieren: Blit zu einer Umleitung Oberfläche von der App, Blit von einer Umleitung Oberfläche zum primären von DWM, die wiederum einige Overhead im Vergleich zu Vollbild ist.

Beachten Sie, dass alle zusätzlichen Arbeiten auf der GPU ausgeführt werden, so dass die CPU-Leistung nicht beeinträchtigt wird.

Stuff weiter zu lesen:

http://blogs.msdn.com/greg_schechter/archive/2006/03/19/555087.aspx

http://blogs.msdn.com/greg_schechter/archive/2006/05/02/588934.aspx

http://blogs.msdn.com/greg_schechter/archive/2006/03/05/544314.aspx

+0

Vielen Dank für Erklärungen! Ich denke, diese Antwort fasst die Situation sehr gut zusammen. – smt

8

Es gibt a bit auf MSDN, die besagt, Vollbildmodus verwendet Puffer spiegeln, wenn richtig eingerichtet, im Gegensatz zu Blitting. Es macht Sinn.

Natürlich können Sie (und in gewisser Weise) eine exklusive Kontrolle für einen Teil des Bildschirms einer Anwendung geben, aber was passiert mit dem Rest des Bildschirms? Sie müssen immer noch Blit, Okklusionsprüfung, etc. auf dem Rest der Fenster, und ich denke, das ist, was den Leistungseinbruch verursacht.

+0

Wie würden Sie einer Anwendung die ausschließliche Kontrolle für einen Teil des Bildschirms geben? Ich hoffe, es wird lösen: http://stackoverflow.com/questions/1357434/choppy-graphics-when-drawing-xna-on-a-winforms-control – Wouter

5

Ich werde zu @aib 's Antwort hinzufügen, dass der Rest des Bildschirms vom Betriebssystem verwaltet wird. Wenn also noch etwas gleichzeitig gezeichnet/bearbeitet werden muss, muss es einen Leistungseinbruch geben.

Zum Beispiel, wenn Sie ein Video abspielen in Windows Media Player in einem Fenster, dann starten Zivilisation in einem anderen, wenn Civ beginnt seine Phantasie Grafiken zu tun, müssen sie Platz auf dem Bildschirm mit alles andere (wie das Video teilen.

Während, wenn die DirectX App hat über den gesamten Bildschirm, alles andere könnte „Aktualisierung“ oder „spielen“, aber nicht gezogen.

+0

Obwohl Ihr letzter Satz ist nur ein Teil des Spiels, wenn Sie denken über Multi-Monitor-Setups nach. – OregonGhost

+0

Ich habe in meinem ursprünglichen Beitrag nicht angegeben, dass ich das in Vista sehe. Wenn ich es richtig verstanden habe, macht Vista mit aktiviertem DWM Fenster-Blitting in Hardware. Ich kann mir keinen besseren Vorschlag ausdenken als den von Aib und Deins, aber es verwirrt mich, ob dieses zusätzliche Blitting die Dinge so sehr verlangsamen kann. – smt

+0

Fair genug, @OregonGhost ... Ich habe versucht, es einfach zu halten :) – warren

1

Grundsätzlich ist die Video-Hardware zur exklusiven Modus-Anwendung vollständig gewidmet ist.

Es gibt keine Konkurrenz für Video-Ressourcen (Pipeline, Texturspeicher, etc ...)

Insbesondere Textur-Upload kann ein großer Engpass sein. Je weniger Sie es tun müssen (weil Sie alles haben), desto besser.

Verwandte Themen