Compartir a través de


Modelo de volteo DXGI

Windows 8 agrega compatibilidad con el modelo de presentación invertida y sus estadísticas presentes asociadas en DXGI 1.2. El modelo de presentación DXGI flip de Windows 8 es similar al presentación en modo 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 voltear. Las aplicaciones que usan el modelo de presentación 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 tasa de presentación proporcionando mecanismos de corrección y comentarios en tiempo real.

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

El tiempo de ejecución usa la transferencia de bloques de bits (bitblt) y los modelos de presentación voltear para presentar contenido gráfico en monitores de visualización. La mayor diferencia entre los modelos de presentación bitblt y flip es cómo el contenido del búfer de reserva llega a Windows 8 DWM para la composición. En el modelo bitblt, el contenido del búfer atrás 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 flip también proporciona más características, como estadísticas presentes mejoradas.

Si tiene componentes heredados que usan windows Graphics Device Interface (GDI) para escribir en un HWND directamente, 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 volteo 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 en una superficie de redirección 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 del modelo volteo

Flip model reduce el uso de memoria del sistema al reducir el número de lecturas y escrituras por el 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 usan el modelo flip creando la cadena de intercambio con el valor de enumeración de DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL establecido en el swapEffect miembro de la estructura de 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 a un valor entre 2 y 16 para evitar una penalización de rendimiento como resultado de esperar a DWM para liberar el búfer de presentación anterior.
  • Formato a 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 en uno y el miembro Quality de DXGI_SAMPLE_DESC a cero porque no se admiten varios suavizados 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 volteo, puede usar estadísticas presentes en 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 runtime crea un búfer de retroceso adicional y gira el identificador que pertenece al búfer que se convierte en el búfer frontal en tiempo de presentación.

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

  • Use una cadena de intercambio de modelos de volteo por HWND. No establecer como destino varias cadenas de intercambio de modelos de volteo a la misma HWND.
  • No use la cadena de intercambio de modelos flip con la función ScrollWindow de GDI o ScrollWindowEx. Algunas aplicaciones de Direct3D usan las funciones de ScrollWindow de GDI y ScrollWindowEx para actualizar el contenido de la ventana después de que se produzca un evento de desplazamiento del usuario. ScrollWindow y ScrollWindowEx realizar bitblts de contenido de ventana en pantalla a medida que el usuario desplaza una ventana. Estas funciones también requieren actualizaciones del modelo 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 de ScrollWindow de GDI y scrollWindowEx y, en su lugar, volver a dibujar el contenido de GDI y Direct3D en la pantalla en respuesta al desplazamiento.
  • Use el modelo flip en unHWND deque no está dirigido también por 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, puede 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 flip, solo se puede ver el contenido de Direct3D en las cadenas de intercambio de modelos invertida 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 actuales son información de tiempo de fotogramas que las aplicaciones multimedia usan para sincronizar secuencias de vídeo y audio y recuperarse de errores 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 información de estadísticas presentes, llame al método IDXGISwapChain::GetFrameStatistics para obtener la estructura DXGI_FRAME_STATISTICS. DXGI_FRAME_STATISTICS contiene estadísticas sobre llamadas de IDXGISwapChain1::P resent1. Una cadena de intercambio de modelos invertidas proporciona información de estadísticas presentes 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.

Para el modelo de volteo presente estadísticas, 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 desde la pantalla completa a transiciones de pantalla completa

Los valores de PresentRefreshCount, SyncRefreshCounty miembros de 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 vsync.

El método IDXGISwapChain::GetLastPresentCount devuelve el último recuento presente, es decir, el identificador actual del último IDXGISwapChain1::P resent1 llamada realizada por un dispositivo para mostrar asociado a la cadena de intercambio. Este identificador actual es el valor del miembro PresentCount de la estructura de 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 errores en la presentación de fotogramas:

  1. Cola llamadas IDXGISwapChain1::P resent1 (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 IDXGISwapChain1::P resent1id. actual (devuelto por IDXGISwapChain::GetLastPresentCount) y los valores asociados, calculados o esperados PresentRefreshCount.

  3. Para detectar un error:

    • Llame a IDXGISwapChain::GetFrameStatistics.
    • Para este marco, 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 que está asociado al identificador actual y que previamente almacenó en la estructura de la cola actual.
    • Si el Actual PresentRefreshCount es posterior al esperado PresentRefreshCount, 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 recuento de vsync real para el identificador actual es 8, el número de fotogramas que se van a omitir para recuperarse del glitch es 3 fotogramas.

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

      Nota

      Si el error se compone 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 todas las notificaciones 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 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. A continuación, 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 error, necesita un total de 8 llamadas IDXGISwapChain1::P resent1. A continuación, 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

En la ilustración se muestra esta secuencia:

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

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

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

  4. La aplicación se activa, representa el color verde, llama a IDXGISwapChain1::P resent1y, 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 representa el color verde de 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 hasta 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 de volteo, rectángulos sucios y áreas desplazadas