Guía de programación de cadenas de intercambio de composición
La API de cadena de intercambio de composición es un sucesor espiritual de la cadena de intercambio DXGI, que permite a las aplicaciones representar y presentar contenido en la pantalla. Hay varias ventajas para usar esta API a través de la cadena de intercambio DXGI. La aplicación dispone de un control más preciso sobre el estado de la cadena de intercambio y tiene más libertad a la hora de utilizarla. Además, la API ofrece una mejor historia para una presentación precisa en el tiempo.
¿Qué es la presentación?
La presentación es el concepto de mostrar los resultados de las operaciones de dibujo en pantalla. Una presentación es una sola instancia de presentación: una solicitud para mostrar los resultados de una operación de dibujo en un único búfer, en pantalla. Una presentación puede contener atributos adicionales que describen cómo mostrarse en pantalla. En esta API, una presentación también puede tener una hora objetivo, que es una marca de tiempo relativa al sistema (un tiempo de interrupción) que describe la hora ideal en que debe mostrarse la presentación. La aplicación puede usarlo para controlar con mayor precisión la velocidad a la que aparece contenido en pantalla y sincronizar las presentaciones con otros eventos en el sistema, como una pista de audio.
El centro de la presentación es la sincronización. Es decir, las operaciones de dibujo se suelen llevar a cabo mediante una GPU, en lugar de la CPU y, como tal, se ejecutan en una escala de tiempo asincrónica desde la CPU que emitió las operaciones inicialmente. La presentación es una operación enviada a la GPU que garantiza que las operaciones de dibujo que se emitieron anteriormente habrán finalizado antes de que el búfer se muestre en pantalla.
Por lo general, la aplicación emitirá muchas presentaciones a lo largo del tiempo y tendrá varias texturas entre las que seleccionar al emitir las presentaciones. La aplicación debe usar los mecanismos de sincronización que proporciona esta API para asegurarse de que, una vez dibujado y presente un búfer, no vuelva a dibujar en ese búfer hasta que se muestre y, posteriormente, se reemplace por uno nuevo de una presentación posterior. De lo contrario, el contenido del búfer que la aplicación pretendía presentar inicialmente se puede sobrescribir, ya que la presentación se muestra en pantalla.
Modos de presentación: composición, superposición multiplano y giro independiente
El sistema puede mostrar los búferes presentados por la aplicación de varias maneras diferentes.
La manera más sencilla, que es el valor predeterminado, es que la presentación se enviará a DWM y DWM representará un marco basado en el búfer que se presentó. Es decir, hay una copia (o más precisamente, una representación 3D) del búfer de presentación en el búfer de reserva que el DWM envía a la pantalla. Este método para mostrar una presentación se denomina Composición.
Un modo más eficaz de mostrar una presentación sería analizar el búfer de presentación directamente en el hardware y eliminar la copia que tiene lugar. Este método para mostrar una presentación se denomina análisis directo. Al controlar las presentaciones, DWM puede decidir programar el hardware para analizar directamente un búfer de presentación, asignando el búfer a un plano de superposición multiplano (o plano MPO, para abreviar) o girar directamente el búfer al hardware (conocido como giro directo).
Una manera aún más eficaz de mostrar una presentación sería que el kernel de gráficos muestre directamente las presentaciones y omita el DWM por completo. Este método de presentación se conoce como giro independiente. Tanto la superposición multiplano como los giros independientes se describen en Para obtener el mejor rendimiento, use el modelo de giro de DXGI.
La composición es la más fácil de admitir, pero también la menos eficaz. La superficie debe asignarse especialmente para ser apta para el análisis directo o los giros independientes, y este tipo de asignación especial tiene requisitos del sistema más estrictos que la cadena de intercambio de composición. Solo está disponible en WDDM 3.0 y hardware superior. Como resultado, la aplicación puede consultar la compatibilidad de la API con la presentación de solo composición, así como la presentación apta para el análisis directo o los giros independientes.
Nota:
Para que las superficies puedan aprovechar estos modos de presentación más optimizados automáticamente, las superficies deben asignarse como visibles directamente por la GPU. Para las superficies de Direct3D 11, debe asignar las superficies como visibles. No obstante, las superficies que no se asignan como visibles se pueden seguir componiendo mediante el compositor del sistema en pantalla, pero nunca obtendrán las ventajas del modo de giro independiente.
Generador de presentaciones, funcionalidad de comprobación y administrador de presentaciones
El primer objeto que usará la aplicación fuera de la API de cadena de intercambio de composición es el generador de presentaciones. La aplicación crea el generador de presentaciones y se enlaza a un dispositivo Direct3D que la aplicación pasa a la llamada para crear y, como tal, tiene una afinidad con el adaptador de vídeo asociado a ese dispositivo.
El generador de presentaciones expone métodos para comprobar si el sistema actual y el dispositivo de gráficos son capaces de usar la API de cadena de intercambio de composición. Puede usar métodos de funcionalidad como IPresentationFactory::IsPresentationSupported para comprobar la compatibilidad del sistema. Si los métodos de funcionalidad indican la compatibilidad del sistema con la API, puede usar el generador de presentaciones para crear un administrador de presentaciones. Este administrador de presentaciones es el objeto que se usa para realizar funciones de presentación y está enlazado al mismo dispositivo Direct3D y al mismo adaptador de vídeo que ese generador de presentaciones que se usó para crearlo.
Actualmente, los requisitos del sistema para usar la API de cadena de intercambio de composición son controladores de GPU compatibles con WDDM (modelo de controladores de dispositivos Windows) 2.0 y Windows 11 (compilación 10.0.22000.194) o superior. Para usar la API de cadena de intercambio de composición de la manera más eficaz (análisis directo y giro independiente), los sistemas necesitarán controladores de GPU compatibles con WDDM 3.0.
Si el sistema no es capaz de usar la API de cadena de intercambio de composición, la aplicación tendrá que tener una ruta de código independiente para controlar la presentación mediante métodos anteriores, como una cadena de intercambio DXGI.
Registro de búferes de presentación para presentar
El administrador de presentaciones realiza un seguimiento de los búferes que puede presentar. Para presentar una textura de Direct3D, la aplicación primero debe crear esa textura con Direct3D y, a continuación, registrarla con el administrador de presentaciones. Cuando se ha registrado una textura con el administrador de presentaciones, se denomina búfer de presentación y puede presentarse desde ese momento a la pantalla por ese administrador de presentaciones. La aplicación puede agregar y quitar búferes de presentación como desee, aunque hay un número máximo de búferes de presentación que se pueden agregar a un único administrador de presentaciones (actualmente 31). Estos búferes de presentación también pueden ser de diferentes tamaños y formatos que surtirán efecto a medida que se presenta un búfer de presentación individual.
Una textura se puede registrar con cualquier número de administradores de presentación; sin embargo, eso no se consideraría el uso normal en la mayoría de los casos y mostrará escenarios de sincronización complicados que la aplicación sería responsable de administrar.
Definición del contenido que se va a presentar
En general, los búferes que presentamos deben asociarse con el contenido de un árbol visual. Por lo tanto, es necesario definir un tipo de enlace para que, cuando la aplicación emita las presentaciones, quede claro en qué parte del árbol visual deben ir los búferes que se presentan. A esto lo llamamos contenido de presentación de enlace.
El contenido presentado podría adoptar muchas formas. Es posible que la aplicación quiera presentar un único búfer para que se muestre, o puede que desee presentar contenido estéreo con búferes para el ojo izquierdo y derecho, etc. La versión inicial de esta API proporciona compatibilidad para presentar un único búfer en pantalla.
Definimos una superficie de presentación para que sea una forma de contenido de presentación en el que se presenta un único búfer a la vez. Una superficie de presentación se puede establecer como contenido en un árbol visual y puede mostrar un único búfer de presentación en pantalla a la vez. Las presentaciones del administrador de presentaciones actualizará el búfer mostrado por una o varias superficies de presentación de forma atómica.
El administrador de presentaciones se puede usar para crear una o varias superficies de presentación para un identificador de superficie de composición determinado. Cada identificador de superficie de composición se puede enlazar a uno o varios objetos visuales de un árbol visual (mediante estrategias descritas en la documentación de la API de Windows.UI.Composition y DirectComposition) para definir la relación entre la superficie de presentación asociada y dónde aparece en su árbol visual. La aplicación puede actualizar una o varias superficies de presentación, que se envían al sistema y tienen lugar en la siguiente operación actual.
Tenga en cuenta que el administrador de presentaciones puede presentar cualquier búfer de presentación a cualquier número de superficies de presentación que desee. No hay restricciones. Sin embargo, depende de la aplicación realizar un seguimiento de los búferes que ha emitido y dónde, con el fin de asegurarse de que no intenta emitir un nuevo dibujo a ese búfer mientras sigue mostrando una superficie de presentación.
Aplicación de propiedades a la superficie de presentación
Además de especificar qué búferes se van a mostrar en una superficie de presentación, una presentación también puede especificar otras propiedades para esa superficie de presentación. Estas incluyen propiedades que definen cómo se muestreará la textura de origen, incluido el modo alfa y el espacio de color, cómo se transformará y se distribuirá la textura de origen, así como las restricciones de reversión o visualización para el contenido protegido. Todas ellas se exponen como métodos establecedores de propiedades en una superficie de presentación que la aplicación puede cambiar y, al igual que las actualizaciones de búfer, surtirán efecto cuando se produzca la presentación de la aplicación.
Presentación a la superficie de presentación
Una vez que la aplicación crea superficies de presentación, registra los búferes de presentación y especifica las actualizaciones que se van a emitir durante una presentación, puede aplicar esas propiedades mediante la presentación. La aplicación emite una presentación a través del administrador de presentaciones. Cuando el sistema procesa esa presentación, todas las actualizaciones se aplican de forma atómica. Además, la aplicación también puede especificar otras propiedades de la presentación, como el momento ideal en que debe llevarse a cabo (la hora objetivo de la presentación) y otras propiedades poco frecuentes, como la velocidad de contenido prevista, que se puede usar para habilitar los modos de actualización personalizados en el sistema. Dado que las presentaciones se pueden programar en un momento dado, la aplicación puede emitir varias presentaciones con antelación. Estas presentaciones se procesarán una a una a medida que se alcance su hora programada.
Sincronización de la presentación
La aplicación debe asegurarse de que, a medida que se representa en los búferes y emite las presentaciones, selecciona un búfer en el que no se hace referencia actualmente a ninguna otra presentación anterior pendiente, ya que, al hacerlo, podría sobrescribir el contenido del búfer que pretendía esas presentaciones. Además, si la aplicación emite la representación en un búfer que se muestra actualmente mediante una superficie de presentación en el hardware de análisis, su representación se puede detener indefinidamente, ya que Direct3D no permite la representación del búfer frontal.
La API de cadena de intercambio de composición proporciona algunos mecanismos diferentes para permitir que la aplicación practique la sincronización adecuada de los búferes que ha presentado.
Se dice que un búfer está disponible si no hay ninguna presentación pendiente que haga referencia a él y actualmente no se muestra en el sistema. De lo contrario, no está disponible. La API proporciona un evento para cada búfer de presentación que indica si el búfer está disponible o no. Este es el método más sencillo de sincronización para que la aplicación la use. Antes de dibujar en un búfer y presentarlo, la aplicación puede asegurarse de que se señale su evento disponible. El evento disponible para un búfer determinado deja de firmarse el momento en que se ha enlazado a una superficie de presentación en la API y permanece sin firmar hasta que se retira la presentación.
En segundo lugar, el administrador de presentaciones realiza un seguimiento de una sola barrera de retirada de presentación para comunicar a la aplicación qué presentaciones ha completado. El valor de la barrera corresponde al identificador actual de la última presentación que inició la fase de retirada de su ciclo de vida, como se describe en la sección ciclo de vida siguiente. Una vez que una presentación entra en esta fase, es seguro suponer que se pueden reutilizar los búferes que se han reemplazado por presentaciones posteriores.
Este método de sincronización es más avanzado, pero permite un mayor control sobre la limitación del flujo de trabajo y es más informativo sobre el estado del sistema en lo que respecta a la profundidad de la cola actual de presentaciones. Para obtener información general sobre el ciclo de vida de una presentación, consulte la sección siguiente.
Ciclo de vida de una presentación
Las presentaciones del administrador de presentaciones se ponen en cola en el sistema como parte de su cola de presentaciones. El sistema procesa las presentaciones en el orden de la cola. Además, cada una de las presentaciones tiene un identificador de presentación (al administrador de presentaciones) asociado, que es un valor de incremento asignado a una presentación, que empieza por 1 para la primera presentación y se incrementa en 1 para cada presentación posterior. Este identificador de presentación se usa en varias partes de la API, como las primitivas de sincronización y las estadísticas de presentación, para hacer referencia a esa presentación en particular.
Cada una de las presentaciones que emite la aplicación sigue un ciclo de vida específico, como se describe aquí.
Una vez que la aplicación configura los cambios que se van a realizar como parte de una presentación, usará el administrador de presentaciones para emitir realmente la presentación. En este momento, se dice que la presentación está pendiente.
Una vez pendiente, una presentación se colocará en la cola de presentaciones del administrador de presentaciones, donde permanecerá hasta que ocurra una de las dos cosas.
- La presentación se cancela. El administrador de presentaciones permite que la aplicación cancele las presentaciones emitidas anteriormente. Si esto sucede, se dice que la presentación se cancela y, a continuación, se retira inmediatamente. En esta transición, los eventos disponibles del búfer asociado para la presentación cancelada se actualizarán, pero no se indicará la barrera de la presentación retirada, ya que la presentación mostrada anteriormente (antes de que se cancelaran las presentaciones) seguirá mostrándose. Por este motivo, la aplicación no puede usar la barrera de la presentación retirada para determinar qué presentaciones se cancelaron. En su lugar, debe obtener este dato de las estadística de estado de la presentación cancelada. Se recomienda que la aplicación use eventos disponibles de búfer para buscar un búfer disponible para presentarlo tras una cancelación. Una vez que se muestre la presentación, la presentación anterior comenzará el proceso de retirada y actualizará la barrera de retirada de la presentación.
- Si no se cancela, la presentación finalmente estará lista para procesarse. Para que esté lista, deben cumplirse dos condiciones importantes.
- Todo el trabajo de dibujo emitido al contexto de Direct3D antes de llamar a la presentación debe completarse. Esto garantiza que el búfer no se muestre antes de que se complete el dibujo de la aplicación.
- Si se especificó una hora objetivo para la presentación, la hora actual relativa al sistema en la que esperamos poder mostrar la presentación coincide con la hora objetivo solicitada que la aplicación aplicó a la presentación.
Cuando el sistema decide encontrar una presentación para mostrar en pantalla, elegirá la última que esté lista para presentarse. Si hay varias presentaciones listas, todas menos la última (es decir, la presentación con el identificador de presentación más alto) se omitirán, e inmediatamente entrarán en el estado de retirada, momento en el que se señalizarán sus eventos de buffer disponible, pero no se señalizará la barrera de retirada de la presentación, ya que la presentación omitida no realiza la transición fuera del estado mostrado.
Cuando se elige mostrar la presentación lista, el sistema comienza a realizar el trabajo para mostrarla en pantalla. Esto puede significar representar el búfer como parte de un fotograma DWM, y luego solicitar al hardware que muestre ese fotograma en pantalla, o puede significar enviar el búfer directamente al hardware de análisis en el caso de giros independientes. Después de esto, se dice que la presentación se ha puesto en cola. A nivel general, esto significa que está en camino de mostrarse.
Cuando el hardware muestra la presentación, se dice que la presentación está mostrada. Y ahí permanecerá, visible en la pantalla, hasta que aparezca una presentación posterior y la reemplace.
Cuando se pone en cola una presentación posterior, sabemos que el hardware finalmente dejará de mostrar la presentación actual. En este momento, se dice que la presentación se está retirando.
Cuando se muestra esa presentación posterior, se dice que la presentación actual se ha retirado.
El administrador de presentaciones expone una barrera de retirada de presentación, que se señala al identificador de presentación de cada presentación cuando entra en estado de retirada. Esta señal indica a la aplicación que es seguro el trabajo de representación en los búferes asociados a esa presentación sin dañar una presentación anterior. Si la aplicación emite un trabajo de representación durante el estado de retirada de la presentación, el trabajo de representación se pondrá en cola hasta que la presentación entre en estado de retirada, momento en el cual se ejecutará. Si el trabajo de representación se emite después de retirarse la presentación, se ejecutará inmediatamente.
A continuación se muestra un diagrama de este cambio de estado.
Diagrama de búferes, superficies y presentaciones
A continuación se muestra un diagrama relacionado con el administrador de presentaciones, los búferes de presentación, las superficies de presentación, las presentaciones y las actualizaciones.
Este diagrama muestra un administrador de presentaciones, con dos superficies de presentación y tres búferes de presentación, al que se le han emitido dos presentaciones hasta el momento: la primera presentación mostró el búfer 1 en la superficie 1, y el búfer 2 en la superficie 2. La segunda presentación actualizó la superficie 2 para mostrar el búfer de presentación 3 y no cambió el enlace de la superficie 1. Después de mostrar la presentación 2, la superficie 1 mostrará el búfer 1 y la superficie 2 mostrará el búfer 3, que se puede ver en el estado actual de los objetos en el administrador de presentaciones. Cada una de las presentaciones en la cola surtirá efecto cuando se procese en el sistema.
Nota:
Dado que la presentación 2 no cambió el búfer de la superficie 1, la superficie 1 se dejó enlazada al búfer 1 de la presentación anterior. En este sentido, hay una referencia "implícita" en el búfer 1 de la presentación 2, ya que la superficie 1 permanecerá enlazada al búfer 1 después de mostrar la presentación 2.
Adición de superficies de presentación al árbol visual
Las superficies de presentación son contenido que existe como parte de un árbol visual de composición. Cada superficie de presentación está enlazada a un identificador de superficie de composición. En Windows.UI.Composition, se puede crear un pincel de superficie para un identificador de superficie de composición preexistente y enlazar a un objeto visual de sprites. En DirectComposition, se puede crear una superficie de composición a partir de un identificador de superficie de composición preexistente y enlazar como contenido a un objeto visual. Consulte la documentación correspondiente para cada API para obtener más información.
Las API como Windows Media Foundation, creadas para usar esta API, exponen los identificadores de superficie de composición que se enlazarán previamente a una superficie de presentación. Una aplicación también puede crear su propio identificador de superficie de composición para enlazar posteriormente a una superficie de presentación y agregarlo a un árbol visual llamando a DCompositionCreateSurfaceHandle.
Lectura de las estadísticas de presentación
La API de cadena de intercambio de composición expone estadísticas de presentación, que describen varias informaciones sobre cómo se procesó una determinada presentación. Por lo general, la información podría describir cómo se usó una superficie de presentación en un fotograma de DWM, el momento en que se mostró, si no se mostró, etc.
Hay diferentes tipos de estadísticas de presentación y están diseñados para ser expandibles en versiones futuras de la API. Una aplicación usa el administrador de presentaciones para registrarse para recibir tipos de estadísticas que le interesan. Estas estadísticas se insertan en la cola de estadísticas del administrador de presentaciones. El administrador de presentaciones expone un evento de estadísticas disponible para las aplicaciones, que es un identificador de eventos que indica cuándo la cola de estadísticas tiene elementos de estadísticas disponibles para leerse. Cuando lo hace, la aplicación puede eliminar de la cola el primer elemento de estadísticas, leerlo y procesarlo. El administrador de presentaciones restablecerá el evento de estadísticas disponible cuando la aplicación haya leído todas las estadísticas que se encuentran actualmente en la cola. Normalmente, una aplicación leerá y procesará las estadísticas en un bucle hasta que se restablezca el evento de estadísticas disponible. Será habitual que la aplicación procese esta cola de estadísticas en el mismo bucle de trabajo que se usa para emitir las presentaciones. El patrón de uso sugerido consiste en priorizar el procesamiento de estadísticas sobre la emisión de nuevas presentaciones, para asegurarse de que la cola no se desborda.
La cola tiene un número máximo de estadísticas de las que realizará el seguimiento, que será del orden de 512-1024 estadísticas. La profundidad máxima de la cola debe ser suficiente para almacenar aproximadamente 5 segundos de estadísticas en casos normales. Si la cola de estadísticas se llena y se notifican más estadísticas, la directiva es que las estadísticas más antiguas se retiren para hacer sitio.