2008-11-20 18 views
23

El rendimiento de una aplicación Direct3D parece ser significativamente mejor en el modo de pantalla completa en comparación con el modo de ventana. ¿Cuáles son las razones técnicas detrás de esto?¿Por qué la aplicación Direct3D funciona mejor en modo de pantalla completa?

Supongo que tiene algo que ver con el hecho de que una aplicación de pantalla completa puede obtener control exclusivo para la pantalla. Pero ¿por qué la aplicación no puede obtener control exclusivo para parte de la pantalla (es decir, ventana) y tiene los mismos beneficios de rendimiento?

+0

Por curiosidad, ¿lo has probado en Vista? Con DWM habilitado, experimenté que la velocidad del modo de ventana era bastante más alta en mi sistema en una aplicación XNA (más alta porque se necesita menos velocidad de relleno, pero el punto es que no es más lento). – OregonGhost

+0

Sí, estoy ejecutando Vista con DWM habilitado. También entiendo que Vista desactiva DWM cuando una aplicación de pantalla completa está activa para liberar recursos. – smt

+0

Vista desactiva DWM solo si la aplicación es incompatible. Tengo algunos juegos que funcionan bien con Aero Glass cuando está en pantalla completa (visible en los otros monitores). Aunque en general eso es cierto, la mayoría de los juegos desactivan DWM. – OregonGhost

Respuesta

23

Aquí están las notas del acantilado sobre cómo funcionan las cosas debajo.

La pantalla del monitor siempre debe estar asociada con so-ca Lleno de superficie primaria para poder mostrar cualquier cosa, es decir, la tarjeta de video solo puede escanear desde una superficie en la memoria de video.

Cuando la aplicación es a pantalla completa (y todo estaba configurado correctamente para habilitar el volteo), la superficie principal es solo uno de los amortiguadores de respaldo de la aplicación, y volteó a otro amortiguador posterior en cada cuadro. Es la forma más eficiente de presentación en la pantalla, pero requiere que la aplicación sea propietaria de toda el área del monitor (es decir, superficie primaria completa).

Cuando no hay una aplicación de pantalla completa y DWM está desactivado, la superficie primaria es propiedad de OS, y cada aplicación con ventana realiza una descarga desde el backbuffer de la aplicación a una superficie principal. Este blit tarda algo de tiempo de GPU en completarse (así como blits de otras aplicaciones visibles en la pantalla), por lo que no es tan eficiente como la presentación en pantalla completa. XP funcionó de esa manera.

Cuando DWM está componiendo la pantalla, las cosas se complican aún más. Aquí, DWM posee la superficie principal y necesita dibujar ventanas de aplicación allí. Para hacerlo posible, cada ventana tiene una superficie asociada que contiene sus contenidos, llamada superficie de redirección (que permite a DWM habilitar el efecto fantasma de las ventanas, los efectos de vidrio y todas esas cosas buenas). Cada vez que la aplicación D3D emite un marco, agrega un blit a una superficie de redirección. De esta manera, deben ocurrir varios blits: blit a una superficie de redirección por la aplicación, blit de una superficie de redirección a la primaria por DWM, que es, de nuevo, algo de sobrecarga en comparación con pantalla completa.

Nota: todo el trabajo adicional se realiza en la GPU, por lo que no afecta el rendimiento de la CPU.

materia para leer más:

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

¡Gracias a todos por las explicaciones! Creo que esta respuesta resume muy bien la situación. – smt

8

Hay a bit en MSDN que dice que el modo de pantalla completa utiliza el intercambio de búfer, si está configurado correctamente, en lugar de blitting. Que tiene sentido.

Por supuesto, puede (y de alguna manera, hacer) dar control exclusivo de parte de la pantalla a una aplicación, pero ¿qué ocurre con el resto de la pantalla? Todavía tiene que ajustar, hacer la comprobación de la oclusión, etc. en el resto de las ventanas, y creo que eso es lo que causa el rendimiento.

+0

¿Cómo le daría control exclusivo de una parte de la pantalla a una aplicación? Espero que lo resuelva: http://stackoverflow.com/questions/1357434/choppy-graphics-when-drawing-xna-on-a-winforms-control – Wouter

5

Voy a agregar a la respuesta de @aib que el resto de la pantalla está siendo administrada por el sistema operativo. Entonces, si hay que dibujar/trabajar algo más simultáneamente, tiene que haber un golpe de rendimiento. Por ejemplo, si tiene un video reproduciéndose en Windows Media Player en una ventana y luego inicia Civilization en otra, cuando Civ empiece a hacer sus gráficos sofisticados, tendrá que compartir el espacio de la pantalla con todo lo demás (como el video).

Mientras que si la aplicación DirectX tiene la pantalla completa, todo lo demás podría ser "puesta al día" o "jugar", pero no está elaborando.

+0

Aunque tu última oración es solo una parte del juego, si piensas en configuraciones de monitores múltiples. – OregonGhost

+0

No dije en mi publicación original que estoy viendo esto en Vista. Si lo entendí correctamente, Vista con DWM habilitado no aparece en el hardware. No puedo encontrar ninguna sugerencia mejor que la de Aib y la tuya, pero me desconcierta si este blitting adicional puede ralentizar tanto las cosas. – smt

+0

, justo, @OregonGhost ... Estaba tratando de mantenerlo simple, aunque :) – warren

1

Básicamente, el hardware de vídeo está completamente dedicado a la aplicación de modo exclusivo.

No hay contención de recursos de vídeo (tubería, la memoria de texturas, etc ...)

En particular, la textura de subida puede ser un gran cuello de botella. Cuanto menos tengas que hacerlo (porque lo tienes todo), mejor.

Cuestiones relacionadas