Para obtener el mejor rendimiento, use el modelo de volteo DXGI.
En este tema se proporcionan instrucciones para desarrolladores sobre cómo maximizar el rendimiento y la eficiencia en la pila de presentaciones en versiones modernas de Windows. Recoge dónde se selecciona el modelo de volteo DXGI, DirectX 12: Modos de presentación en Windows 10 (vídeo) y Mejoras de presentación en Windows 10: Una apariencia temprana (vídeo) se dejó.
Llamada a la acción
Si sigue usando DXGI_SWAP_EFFECT_DISCARD o DXGI_SWAP_EFFECT_SEQUENTIAL (a.k.a. el modelo "blt"), es el momento de detenerlo.
Cambiar a DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL o DXGI_SWAP_EFFECT_FLIP_DISCARD (a.k.a. el modelo de volteo) proporcionará un mejor rendimiento, un menor uso de energía y proporcionará un conjunto más completo de características. (Vea DXGI_SWAP_EFFECT enumeración para obtener más información sobre estos valores).
El modelo flip presenta hasta el punto de hacer que el modo de ventana sea eficazmente equivalente o mejor cuando se compara con el modo clásico "exclusivo de pantalla completa". De hecho, es posible que quiera reconsiderar si la aplicación realmente necesita un modo exclusivo de pantalla completa, ya que las ventajas de una ventana sin borde de un modelo invertido incluyen un cambio más rápido Alt-Tab y una mejor integración con las características de visualización modernas.
¿Por qué se aplican ahora? Antes de la actualización de abril de 2018, el modelo blt presenta podría provocar un desgarro visible cuando se usa en configuraciones híbridas de GPU, que a menudo se encuentran en equipos portátiles de gama alta (consulte KB 3158621). En la actualización de abril de 2018, este desmontaje se ha corregido, a costa de algún trabajo adicional. Si va a realizar lt presenta velocidades de fotogramas elevadas en GPU híbridas, especialmente en resoluciones altas como 4K, este trabajo adicional puede afectar al rendimiento general. Para mantener el mejor rendimiento en estos sistemas, cambie de la bilt al modelo actual. Además, considere la posibilidad de reducir la resolución de la cadena de intercambio, especialmente si no es el punto principal de interacción del usuario (como suele ocurrir con las ventanas de vista previa de VR).
Una breve historia
¿Qué es el modelo de volteo? ¿Cuál es la alternativa?
Antes de Windows 7, la única manera de presentar contenido de D3D era "blt" o copiarlo en una superficie que era propiedad de la ventana o la pantalla. A partir del efecto de intercambio FLIPEX de D3D9 y llegar a DXGI a través del efecto de intercambio de FLIP_SEQUENTIAL en Windows 8, hemos desarrollado una manera más eficaz de poner contenido en pantalla compartiendolo directamente con el compositor de escritorio, con copias mínimas. Consulte DxGI flip model (Modelo de volteo DXGI ) para obtener información general sobre la tecnología.
Esta optimización es posible gracias a DWM (Administrador de ventanas de escritorio), que es el compositor que controla el escritorio de Windows.
¿Cuándo debo usar el modelo blt?
Hay una parte de la funcionalidad que el modelo de volteo no proporciona: la capacidad de tener varias API diferentes que generan contenido, que todas las capas se unen en el mismo HWND, de forma presente. Un ejemplo de esto sería usar D3D para dibujar un fondo de ventana y, a continuación, GDI de Windows para dibujar algo en la parte superior, o usar dos API de gráficos diferentes, o dos cadenas de intercambio de la misma API, para generar fotogramas alternados. Si no necesita interoperabilidad de nivel HWND entre componentes gráficos, no necesita el modelo blt.
Hay una segunda parte de la funcionalidad que no se proporcionó en el diseño del modelo de volteo original, pero ahora está disponible, que es la capacidad de presentar en una velocidad de fotogramas no limitada. En el caso de una aplicación que use el intervalo de sincronización 0, no se recomienda cambiar al modelo invertido a menos que la API IDXGIFactory5::CheckFeatureSupport esté disponible y se admita la compatibilidad de informes para DXGI_FEATURE_PRESENT_ALLOW_TEARING. Esta característica es casi ubicua en las versiones recientes de Windows 10 y en hardware moderno.
DirectFlip
Si has visto DirectX 12: Modos de presentación en Windows 10, verás hablar sobre "Volteo directo" y "Volteo independiente". Se trata de optimizaciones habilitadas para aplicaciones que usan cadenas de intercambio de modelos invertida. Dependiendo de la configuración de ventana y búfer, es posible omitir la composición de escritorio por completo y enviar directamente fotogramas de aplicación a la pantalla, de la misma manera que hace la pantalla completa exclusiva.
En estos días, estas optimizaciones pueden participar en uno de los tres escenarios, para aumentar la funcionalidad:
- DirectFlip: los búferes de cadena de intercambio coinciden con las dimensiones de pantalla y la región cliente de ventana cubre la pantalla. En lugar de usar la cadena de intercambio DWM para mostrarse en la pantalla, se usa la cadena de intercambio de aplicaciones.
- DirectFlip con marcadores de panel: la región cliente de ventana cubre la pantalla y los búferes de la cadena de intercambio están dentro de algún factor de escala dependiente del hardware (por ejemplo, 0,25 x a 4x) de la pantalla. El hardware de examen de GPU se usa para escalar el búfer al enviarlo a la pantalla.
- DirectFlip con superposición de varios planos (MPO): los búferes de cadena de intercambio están dentro de algún factor de escala dependiente del hardware de las dimensiones de ventana. DwM puede reservar un plano de examen de hardware dedicado para la aplicación, que luego se examina y se extiende potencialmente a una sub región de la pantalla mezclada alfa.
Con el modelo de volteo en ventana, la aplicación puede consultar la compatibilidad de hardware con diferentes escenarios de DirectFlip e implementar diferentes tipos de escalado dinámico mediante el uso de IDXGIOutput6::CheckHardwareCompositionSupport. Una advertencia que hay que tener en cuenta es que si se utilizan los ajustadores de paneles, es posible que el cursor sufra efectos secundarios de extensión, que se indica a través de DXGI_HARDWARE_COMPOSITION_SUPPORT_FLAG_CURSOR_STRETCHED.
Una vez que la cadena de intercambio ha sido "DirectFlipped", el DWM puede ir a suspensión y solo se reactiva cuando algo cambia fuera de la aplicación. Los fotogramas de la aplicación se envían directamente a la pantalla, de forma independiente, con la misma eficacia que la exclusiva de pantalla completa. Esto es "Volteo independiente" y puede participar en todos los escenarios anteriores. Si otros contenidos de escritorio están en la parte superior, DWM puede volver a realizar la transición sin problemas al modo compuesto, de forma eficaz "redactar inverso" el contenido de la parte superior de la aplicación antes de voltearlo o aprovechar MPO para mantener el modo de volteo independiente.
Consulte la herramienta PresentMon para obtener información sobre cuál de los anteriores se usó.
¿Qué más es nuevo en el modelo de volteo?
Además de las mejoras anteriores, que se aplican a las cadenas de intercambio estándar sin nada especial, hay varias características disponibles para que las aplicaciones de modelo de volteo usen:
- Disminución de la latencia mediante DXGI_SWAP_CHAIN_FLAG_FRAME_LATENCY_WAITABLE_OBJECT. Cuando se encuentra en modo De volteo independiente, puede bajar a 1 fotograma de latencia en las versiones recientes de Windows, con reserva correcta al mínimo posible cuando se redacte.
- Advertencia: hubo un problema que dio un mínimo de dos fotogramas de latencia en la actualización de aniversario de Windows 10 y versiones anteriores. Consulte este tema de foro para obtener más información. Esto se ha corregido en la actualización de Fall Creator.
- DXGI_SWAP_EFFECT_FLIP_DISCARD habilita un modo de "composición inversa" de volteo directo, lo que da como resultado un trabajo menos general para mostrar el escritorio. DwM puede escribir en los búferes de la aplicación y enviarlos a la pantalla, en lugar de realizar una copia completa en sus propias cadenas de intercambio.
- DXGI_SWAP_CHAIN_FLAG_ALLOW_TEARING puede habilitar incluso una latencia menor que el objeto de espera, incluso en una ventana en sistemas con compatibilidad con superposición de varios planos.
- Las aplicaciones tienen control sobre el escalado de contenido que se produce durante el cambio de tamaño de la ventana, usando la propiedad DXGI_SCALING establecida durante la creación de la cadena de intercambio.
- El contenido en formatos HDR (R10G10B10A2_UNORM o R16G16B16A16_FLOAT) no está sujeta a menos que esté compuesto por un escritorio SDR.
- Las estadísticas actuales están disponibles en modo de ventana.
- Hay mayor compatibilidad con el modelo de aplicación de UWP (Plataforma universal de Windows) y DX12, ya que solo son compatibles con el modelo de volteo.
¿Qué tengo que hacer para usar el modelo de volteo?
Las cadenas de intercambio de modelos flip tienen algunos requisitos adicionales sobre las cadenas de intercambio blt:
- El número de búferes debe ser de al menos 2.
- Después de las llamadas Present , el búfer de reserva debe volver a enlazarse explícitamente al contexto inmediato D3D11 antes de que se pueda volver a usar.
- Después de llamar a SetFullscreenState, la aplicación debe llamar a ResizeBuffers antes de Present.
- Las cadenas de intercambio de MSAA (suavizado multiample) no se admiten directamente en el modelo de volteo, por lo que la aplicación tendrá que resolver una MSAA antes de emitir el presente.
Cómo elegir las resoluciones de presentación y representación adecuadas
El patrón tradicional para las aplicaciones en el pasado ha sido proporcionar al usuario una lista de resoluciones entre las que elegir cuando el usuario selecciona el modo de pantalla completa exclusivo. Con la posibilidad de que las pantallas modernas comiencen a escalar contenido sin problemas, considere la posibilidad de proporcionar a los usuarios la posibilidad de elegir una resolución de representación para el escalado de rendimiento, independientemente de una resolución de salida e incluso en modo con ventanas. Además, las aplicaciones deben aprovechar IDXGIOutput6::CheckHardwareCompositionSupport para determinar si necesitan escalar el contenido antes de presentarlo, o si deben permitir que el hardware realice el escalado para ellos.
Es posible que el contenido deba migrarse de una GPU a otra como parte de la operación actual o de composición. Esto suele ser cierto en equipos portátiles con varias GPU o sistemas con GPU externas conectadas. A medida que estas configuraciones son más comunes y, a medida que las pantallas de alta resolución se vuelven más comunes, aumenta el costo de presentar una cadena de intercambio de resolución completa. Si el destino de la cadena de intercambio no es el punto principal de interacción del usuario, como suele ser el caso de los títulos de VR que presentan una vista previa 2D de la escena de VR en una ventana secundaria, considere la posibilidad de usar una cadena de intercambio de resolución inferior para minimizar la cantidad de ancho de banda que se debe transferir a través de diferentes GPU.
Otras consideraciones
La primera vez que pida a la GPU que escriba en el búfer de reserva de la cadena de intercambio es el momento en que la GPU se detendrá esperando a que el búfer esté disponible. Cuando sea posible, retrase este punto en el marco lo más posible.