performance - wowlatinoamerica - ¿Por qué la aplicación Direct3D funciona mejor en modo pantalla completa?
wow us (4)
Hay un poco 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 algún modo, lo hace) otorgar control exclusivo para una 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.
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?
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 el control exclusivo de una parte de la pantalla (es decir, la ventana) y tiene los mismos beneficios de rendimiento?
Aquí están las notas del acantilado sobre cómo funcionan las cosas debajo.
La pantalla del monitor siempre debe estar asociada con la llamada superficie principal para poder mostrar cualquier cosa, es decir, la tarjeta de video solo puede escanearse de una superficie en la memoria de video.
Cuando la aplicación es de 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 todo el área del monitor (es decir, superficie primaria completa).
Cuando no hay una aplicación de pantalla completa y DWM está desactivado, la superficie principal es propiedad del SO, 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 aplicaciones 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 cuadro, agrega un blit a una superficie de redirección. De esta forma, 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.
Tenga en cuenta que todo ese trabajo adicional está en la GPU, por lo que no afecta el rendimiento de la CPU.
Cosas 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
Básicamente, el hardware de video está completamente dedicado a la aplicación de modo exclusivo.
No hay contención para los recursos de video (tubería, memoria de textura, etc.)
En particular, la carga de textura puede ser un gran cuello de botella. Cuanto menos tengas que hacerlo (porque lo tienes todo), mejor.
Agregaré a la respuesta de @ aib que el OS está administrando el resto de la pantalla. 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 el Reproductor de Windows Media en una ventana y luego inicia Civilization en otro, 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 "actualización" o "reproducción", pero no se está dibujando.