¿Por qué la aplicación Direct3D funciona mejor en modo de pantalla completa?
-
08-07-2019 - |
Pregunta
El rendimiento de una aplicación Direct3D parece ser significativamente mejor en 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 un control exclusivo para la pantalla. Pero, ¿por qué la aplicación no puede obtener el control exclusivo de parte de la pantalla (es decir, la ventana) y tener los mismos beneficios de rendimiento?
Solución
Aquí están las notas del acantilado sobre cómo funcionan las cosas debajo.
La pantalla del monitor siempre debe asociarse con la llamada 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 de pantalla completa (y todo se configuró correctamente para permitir el volteo), la superficie primaria es solo uno de los backbuffers de la aplicación, y se voltea a otro backbuffer cada fotograma. Es la forma más eficiente de presentar en la pantalla, pero requiere que la aplicación posea toda el área del monitor (es decir, toda la superficie primaria).
Cuando no hay una aplicación de pantalla completa y DWM está desactivado, la superficie primaria es propiedad del sistema operativo, y cada aplicación con ventana realiza una interrupción desde el backbuffer de la aplicación a una superficie primaria. Este blit tarda un tiempo en completar la GPU (así como los blits de las otras aplicaciones visibles en la pantalla), por lo que no es tan eficiente como la presentación a pantalla completa. XP funcionó de esa manera.
Cuando DWM está componiendo la pantalla, las cosas se vuelven aún más complicadas. Aquí, DWM posee la superficie primaria y necesita dibujar ventanas de aplicación allí. Para hacerlo posible, cada ventana tiene una superficie asociada que contiene su contenido, llamada superficie de redirección (que permite a DWM habilitar el efecto fantasma de la ventana, los efectos de cristal y todo lo bueno). Cada vez que la aplicación D3D emite un marco, agrega un poco a una superficie de redireccionamiento. De esa manera, deben producirse varios cambios: la transferencia a una superficie de redireccionamiento por parte de la aplicación, la transferencia desde una superficie de redireccionamiento a la primaria por DWM, que es, nuevamente, algo de sobrecarga en comparación con la 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/ archivo / 2006/03/19 / 555087.aspx
http://blogs.msdn.com/greg_schechter/ archivo / 2006/05/02 / 588934.aspx
http://blogs.msdn.com/greg_schechter/ archivo / 2006/03/05 / 544314.aspx
Otros consejos
Hay un poco en MSDN que dice que el modo de pantalla completa usa volteo de búfer, si está configurado correctamente, en lugar de bliting. Tiene sentido.
Por supuesto que puede (y de alguna manera, puede) otorgar un control exclusivo de una parte de la pantalla a una aplicación, pero ¿qué sucede con el resto de la pantalla? Todavía tiene que borrar, hacer una verificación de oclusión, etc. en el resto de las ventanas, y creo que eso es lo que causa el impacto en el rendimiento.
Por ejemplo, si tiene un video que se reproduce en Windows Media Player en una ventana, luego inicie Civilization en otra, cuando Civ comience a hacer sus gráficos elegantes, necesitará compartir el espacio de la pantalla con todo lo demás (como el video.
Mientras que si la aplicación DirectX tiene pantalla completa, todo lo demás podría estar "actualizándose" o " jugando " ;, pero no siendo dibujado.
Básicamente, el hardware de video está completamente dedicado a la aplicación de modo exclusivo.
No hay contención por los recursos de video (canalización, memoria de textura, etc.)
En particular, la carga de texturas puede ser un gran cuello de botella. Cuanto menos tenga que hacerlo (porque lo tiene todo), mejor.