Compartir a través de


Modelo de volteo DXGI

Windows 8 agrega compatibilidad con el modelo de presentación de volteo y sus estadísticas presentes asociadas en DXGI 1.2. Windows 8 modelo de presentación de volteo DXGI es similar a la presentación en modo de volteo direct3D 9EX de Windows 7. Las aplicaciones de presentación basadas en velocidad de fotogramas o vídeo, como los juegos, pueden beneficiarse más mediante el modelo de presentación invertida. Las aplicaciones que usan el modelo de presentación de volteo DXGI reducen la carga de recursos del sistema y aumentan el rendimiento. Las aplicaciones también pueden usar mejoras de estadísticas presentes con el modelo de presentación invertida para controlar mejor la velocidad de presentación proporcionando mecanismos de corrección y comentarios en tiempo real.

Comparación del modelo de volteo DXGI y el modelo de BitBlt

El tiempo de ejecución usa la transferencia de bloques de bits (bitblt) y los modelos de presentación para presentar contenido gráfico en monitores de pantalla. La mayor diferencia entre los modelos de presentación bitblt y flip es cómo el contenido del búfer de reserva llega al Windows 8 DWM para la composición. En el modelo bitblt, el contenido del búfer de reserva se copia en la superficie de redirección en cada llamada a IDXGISwapChain1::P resent1. En el modelo de volteo, todos los búferes de reserva se comparten con el Administrador de ventanas de escritorio (DWM). Por lo tanto, DWM puede componer directamente desde esos búferes de reserva sin ninguna operación de copia adicional. En general, el modelo de volteo es más eficaz. El modelo de volteo también proporciona más características, como estadísticas actuales mejoradas.

Si tiene componentes heredados que usan windows Graphics Device Interface (GDI) para escribir directamente en un HWND , use el modelo bitblt.

Las mejoras de rendimiento del modelo de volteo DXGI son significativas cuando la aplicación está en modo de ventana. La secuencia de esta tabla y la ilustración comparan los usos de ancho de banda de memoria y las lecturas y escrituras del sistema de aplicaciones con ventanas que eligen el modelo invertido frente al modelo bitblt.

Paso Modelo bitBlt presente a DWM Modelo de volteo DXGI presente en DWM
1. La aplicación actualiza su marco (escritura)
La aplicación actualiza su marco (escritura)
2. El tiempo de ejecución de Direct3D copia el contenido de la superficie de superficie en una superficie de redireccionamiento de DWM (lectura, escritura)
El tiempo de ejecución de Direct3D pasa la superficie de la aplicación a DWM
3. Una vez completada la copia de la superficie compartida, DWM representa la superficie de la aplicación en pantalla (lectura, escritura)
DWM representa la superficie de la aplicación en pantalla (lectura, escritura)

 

Ilustración de una comparación del modelo blt y el modelo de volteo

El modelo de volteo reduce el uso de memoria del sistema al reducir el número de lecturas y escrituras por parte del tiempo de ejecución de Direct3D para la composición de fotogramas ventanas por DWM.

Cómo usar el modelo de volteo DXGI

Las aplicaciones de Direct3D 11.1 destinadas a Windows 8 usar el modelo de volteo mediante la creación de la cadena de intercambio con el valor de enumeración DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL establecido en el miembro SwapEffect de la estructura DXGI_SWAP_CHAIN_DESC1. Al establecer SwapEffect en DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL, establezca también estos miembros de DXGI_SWAP_CHAIN_DESC1 en los valores indicados:

  • BufferCount en un valor comprendido entre 2 y 16 para evitar una penalización de rendimiento como resultado de esperar a QUE DWM libere el búfer de presentación anterior.
  • Formato para DXGI_FORMAT_R16G16B16A16_FLOAT, DXGI_FORMAT_B8G8R8A8_UNORM o DXGI_FORMAT_R8G8B8A8_UNORM
  • Miembro count de la estructura de DXGI_SAMPLE_DESC que el miembro SampleDesc especifica a uno y el miembro Quality de DXGI_SAMPLE_DESC a cero porque no se admiten varios suavizados de contorno de muestra (MSAA)

Si usas DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL en windows 7 o en un sistema operativo anterior, se produce un error en la creación de dispositivos. Al usar el modelo de volteo, puede usar estadísticas de presentación de pantalla completa en modo de ventana. El comportamiento de pantalla completa no se ve afectado. Si pasa NULL al parámetro pFullscreenDesc de IDXGIFactory2::CreateSwapChainForHwnd para una cadena de intercambio ventanada y establece SwapEffect en DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL, el tiempo de ejecución crea un búfer de reserva adicional y gira el identificador que pertenezca al búfer que se convierte en el búfer frontal en tiempo de presentación.

Al usar el modelo de volteo, tenga en cuenta estas sugerencias:

  • Use una cadena de intercambio de modelo invertida por HWND. No dirija varias cadenas de intercambio de modelos de volteo al mismo HWND.
  • No use la cadena de intercambio de modelos de volteo con la función ScrollWindow o ScrollWindowEx de GDI. Algunas aplicaciones de Direct3D usan las funciones ScrollWindow y ScrollWindowEx de GDI para actualizar el contenido de la ventana después de que se produzca un evento de desplazamiento del usuario. ScrollWindow y ScrollWindowEx realizan bits del contenido de la ventana en pantalla a medida que el usuario desplaza una ventana. Estas funciones también requieren actualizaciones de modelos bitblt para el contenido de GDI y Direct3D. Las aplicaciones que usan cualquiera de las funciones no mostrarán necesariamente el contenido de la ventana visible que se desplaza en pantalla cuando la aplicación está en modo de ventana. Se recomienda no usar las funciones ScrollWindow y ScrollWindowEx de GDI y, en su lugar, volver a dibujar el contenido de GDI y Direct3D en la pantalla en respuesta al desplazamiento.
  • Usa el modelo de volteo en un HWND que no es también el destino de otras API, incluido el modelo de presentación bitblt DXGI, otras versiones de Direct3D o GDI. Dado que el modelo bitblt mantiene una copia adicional de la superficie, puedes agregar GDI y otro contenido de Direct3D al mismo HWND a través de actualizaciones por etapas de Direct3D y GDI. Cuando se usa el modelo de volteo, solo se puede ver el contenido de Direct3D en las cadenas de intercambio de modelos invertido que el tiempo de ejecución pasa a DWM. El tiempo de ejecución omite todas las demás actualizaciones de contenido de Direct3D o GDI del modelo bitblt.

Sincronización de fotogramas de aplicaciones de modelo de volteo DXGI

Las estadísticas presentes son información de tiempo de fotogramas que las aplicaciones multimedia usan para sincronizar secuencias de vídeo y audio y recuperarse de problemas de reproducción de vídeo. Las aplicaciones pueden usar la información de tiempo de fotogramas en las estadísticas presentes para ajustar la velocidad de presentación de sus fotogramas de vídeo para una presentación más fluida. Para obtener la información de estadísticas actual, llame al método IDXGISwapChain::GetFrameStatistics para obtener la estructura DXGI_FRAME_STATISTICS . DXGI_FRAME_STATISTICS contiene estadísticas sobre las llamadas IDXGISwapChain1::P resent1 . Una cadena de intercambio de modelos de volteo proporciona información de estadísticas en los modos de pantalla completa y en ventanas. En el caso de las cadenas de intercambio de modelos bitblt en modo de ventana, todos los valores de DXGI_FRAME_STATISTICS son ceros.

En el caso del modelo de volteo, IDXGISwapChain::GetFrameStatistics devuelve DXGI_ERROR_FRAME_STATISTICS_DISJOINT en estas situaciones:

  • Primera llamada a GetFrameStatistics, que indica el principio de una secuencia
  • Cambio de modo: modo con ventana a o desde la pantalla completa o la pantalla completa a las transiciones de pantalla completa

Los valores de los miembros PresentRefreshCount, SyncRefreshCount y SyncQPCTime de DXGI_FRAME_STATISTICS tienen las siguientes características:

  • PresentRefreshCount es igual a SyncRefreshCount cuando la aplicación se presenta en cada vsync.
  • SyncRefreshCount se obtiene en el intervalo de sincronización virtual cuando se envió el presente, SyncQPCTime es aproximadamente el tiempo asociado al intervalo de sincronización virtual.

El método IDXGISwapChain::GetLastPresentCount devuelve el último recuento presente, es decir, el identificador actual de la última llamada IDXGISwapChain1::P resent1 realizada por un dispositivo de visualización asociado a la cadena de intercambio. Este identificador presente es el valor del miembro PresentCount de la estructura DXGI_FRAME_STATISTICS . En el caso de las cadenas de intercambio de modelos bitblt, mientras que en modo de ventana, todos los valores de DXGI_FRAME_STATISTICS son ceros.

Evitar, detectar y recuperarse de problemas

Realice estos pasos para evitar, detectar y recuperarse de problemas en la presentación de fotogramas:

  1. Cola IDXGISwapChain1::P resent1 llamadas (es decir, llama a IDXGISwapChain1::P resent1 varias veces, lo que hace que se recopilen en una cola).

  2. Cree una estructura de cola presente para almacenar todos los valores idXGISwapChain1::P resent1 (devuelto por IDXGISwapChain::GetLastPresentCount) y asociados, calculados o esperados presentRefreshCount .

  3. Para detectar un error:

    • Llame a IDXGISwapChain::GetFrameStatistics.
    • Para este fotograma, obtenga el identificador actual (PresentCount) y el recuento de vsync donde el sistema operativo presentó la última imagen al monitor (PresentRefreshCount).
    • Recupere el presentRefreshCount esperado asociado al identificador actual y que anteriormente almacenó en la estructura present-queue.
    • Si el valor actual de PresentRefreshCount es posterior al valor de PresentRefreshCount esperado, se ha producido un error.
  4. Para recuperarse del error:

    • Calcule el número de fotogramas que se van a omitir para recuperarse del error. Por ejemplo, si el paso 3 revela que el recuento de vsync esperado (PresentRefreshCount) para un identificador actual (PresentCount) es 5 y el número de vsync real para el identificador actual es 8, el número de fotogramas que se omitirán para recuperarse del error es de 3 fotogramas.

    • Pase 0 al parámetro SyncInterval en este número de llamadas a IDXGISwapChain1::P resent1 para descartar y omitir este número de fotogramas.

      Nota

      Si el error consta de un gran número de fotogramas, llame a IDXGISwapChain1::P resent1 con el parámetro Flags establecido en DXGI_PRESENT_RESTART para descartar y omitir todos los regalos pendientes en cola.

       

Este es un escenario de ejemplo de recuperación de problemas en la presentación de fotogramas:

Ilustración de un escenario de ejemplo de recuperación de problemas en la presentación de fotogramas

En el escenario de ejemplo, espera que el fotograma A vaya a la pantalla en un recuento asincrónico de vsync de 1. Pero realmente detecta el recuento de vsync que el fotograma A aparece en la pantalla como 4. Por lo tanto, determina que se ha producido un error. Después, puede descartar 3 fotogramas, es decir, puede pasar 0 al parámetro SyncInterval en 3 llamadas a IDXGISwapChain1::P resent1. En el escenario de ejemplo anterior, para recuperarse del problema, necesita un total de 8 llamadas IDXGISwapChain1::P resent1 . Después, el fotograma 9 es visible según el recuento de vsync que espera.

Esta es una línea temporal de eventos de presentación. Cada línea vertical representa una vsync. La dirección horizontal es el tiempo, lo que aumenta a la derecha. Puede usar la ilustración para imaginar cómo pueden producirse los problemas.

ilustración de una línea de tiempo de eventos de presentación

La ilustración ilustra esta secuencia:

  1. La aplicación se reactiva en vsync, representa azul, llama a IDXGISwapChain1::P resent1 y, a continuación, vuelve a dormir.

  2. La unidad de procesamiento de gráficos (GPU) se reactiva de modo inactivo, realiza la representación en azul y, a continuación, vuelve a dormir.

  3. El DWM se reactiva en la siguiente vsync, compone azul en su búfer de reserva, llama a IDXGISwapChain1::P resent1 y, a continuación, vuelve a dormir.

  4. La aplicación se reactiva, representa el color verde, llama a IDXGISwapChain1::P resent1 y, a continuación, vuelve a dormir.

    Nota

    La aplicación se ejecuta simultáneamente mientras la GPU realiza la composición de azul.

     

  5. A continuación, la GPU se representa en verde para la aplicación.

  6. Por último, el convertidor digital a analógico (DAC) muestra los resultados de la composición DWM en el monitor en la siguiente vsync.

Desde la línea de tiempo, puede imaginar la latencia de las estadísticas actuales y cómo pueden producirse problemas. Por ejemplo, para mostrar un error de DWM para el color verde que aparece en la pantalla, imagine ampliar el cuadro verde/rojo para que el lado derecho del cuadro verde/rojo coincida con el lado derecho del cuadro púrpura/rojo. En este escenario, la DAC muestra dos fotogramas de azul y, a continuación, el marco verde. Puede ver que este error se produjo al leer las estadísticas presentes.

Mejora de la presentación con el modelo flip, rectángulos sucios y áreas desplazadas