Compartir a través de


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 eficacia en la pila de presentaciones en versiones modernas de Windows. Selecciona dónde modelo de volteo DXGI, DirectX 12: Modos de presentación en Windows 10 (vídeo), y Mejoras de presentación en Windows 10: Una vista temprana (vídeo) 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 detenerse.

Cambiar a DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL o DXGI_SWAP_EFFECT_FLIP_DISCARD (a.k.a. el modelo flip) proporcionará un mejor rendimiento, un menor uso de energía y proporcionará un conjunto más completo de características. (Consulte DXGI_SWAP_EFFECT de 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 de Alt-Tab más rápido y una mejor integración con las características de pantalla modernas.

¿Por qué 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 desgarro se ha corregido, a costa de algún trabajo adicional. Si está realizando blt presenta altas velocidades de fotogramas 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 blt al modelo actual de volteo. 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

¿Cuál 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 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 modelo de volteo DXGI para obtener información general de alto nivel 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 invertido no proporciona: la capacidad de tener varias API diferentes que generan contenido, que todas las capas se unen en la misma HWND, en función de la 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 producir fotogramas alternas. Si no necesita HWNDinteroperabilidad de nivel entre componentes gráficos, no necesita el modelo blt.

Hay una segunda parte de la funcionalidad que no se proporcionó en el diseño original del modelo flip, 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 de IDXGIFactory5::CheckFeatureSupport esté disponible y la compatibilidad de informes con DXGI_FEATURE_PRESENT_ALLOW_TEARING. Esta característica es casi omnipresente en 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 "Direct Flip" y "Independent Flip". Se trata de optimizaciones que están habilitadas para las aplicaciones que usan cadenas de intercambio de modelos flip. Dependiendo de la configuración de ventana y búfer, es posible omitir la composición del 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, con el fin de aumentar la funcionalidad:

  1. DirectFlip: los búferes de la cadena de intercambio coinciden con las dimensiones de pantalla y la región del cliente de ventana cubre la pantalla. En lugar de usar la cadena de intercambio DWM para mostrar en la pantalla, se usa la cadena de intercambio de aplicaciones.
  2. DirectFlip con los ajustadores de panel: la región del 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,25x a 4x) de la pantalla. El hardware de examen de GPU se usa para escalar el búfer al enviarlo a la pantalla.
  3. DirectFlip con superposición de varios planos (MPO): los búferes de la cadena de intercambio se encuentran 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 subregión mezclada alfa de la pantalla.

Con el modelo volteo en ventanas, 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 panel, 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 cambia algo 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 "revertir la redacción" del contenido en 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 las anteriores se usó.

¿Qué más hay 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 volteo usen:

  • Disminución de la latencia mediante DXGI_SWAP_CHAIN_FLAG_FRAME_LATENCY_WAITABLE_OBJECT. Cuando se encuentra en el modo Volteo independiente, puede bajar a 1 fotograma de latencia en versiones recientes de Windows, con reserva correcta al mínimo posible cuando se compone.
    • 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 para UWP (Plataforma universal de Windows) y DX12, ya que solo son compatibles con el modelo flip.

¿Qué tengo que hacer para usar el modelo flip?

Las cadenas de intercambio de modelos flip tienen algunos requisitos adicionales sobre las cadenas de intercambio blt:

  1. El número de búferes debe ser al menos 2.
  2. Después de llamadas presentes, el búfer de reserva debe volver a enlazarse explícitamente al contexto inmediato D3D11 antes de que se pueda volver a usar.
  3. Después de llamar a SetFullscreenState, la aplicación debe llamar a ResizeBuffers antes de Presente.
  4. Las cadenas de intercambio anti alias de MSAA (multisample) no se admiten directamente en el modelo de volteo, por lo que la aplicación tendrá que resolver una MSAA antes de emitir la Present.

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 capacidad de las pantallas modernas de comenzar 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 de ventana. 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 presente 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 debe transferirse a través de diferentes GPU.

Otras consideraciones

La primera vez que pida a la GPU que escriba en el búfer 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.