Superficie de composición

Nota

En el caso de las aplicaciones de Windows 10, se recomienda usar las API de Windows.UI.Composition en lugar de DirectComposition. Para obtener más información, consulta Modernize your desktop app using the Visual layer (Modernización de la aplicación de escritorio mediante la capa visual).

En este tema se describen los tipos de superficies que admite Microsoft DirectComposition.

Superficie lógica DirectComposition

DirectComposition expone el objeto IDCompositionSurface para representar una superficie de composición lógica. DirectComposition expone las API que puede usar para crear, actualizar y eliminar estas superficies lógicas. Cada superficie se puede asociar a uno o varios objetos visuales. Una aplicación es responsable de administrar la duración de las superficies lógicas.

Actualización de una superficie lógica

Una aplicación puede actualizar una superficie lógica llamando a BeginDraw y especificando el tamaño y el desplazamiento del rectángulo en la superficie lógica que la aplicación desea actualizar. DirectComposition asigna un rectángulo del tamaño especificado y, a continuación, devuelve la superficie y el desplazamiento correspondiente que la aplicación necesita dibujar o actualizar. Los límites del rectángulo de actualización están enlazados por el tamaño de la superficie. Por ejemplo, el rectángulo de actualización de una superficie de 40 a 100 píxeles puede ser de hasta (0 0 0 40 100). Además, un rectángulo de protección aplica la región actualizable. Dado que solo puede haber un rectángulo de protección a la vez, solo se puede actualizar una superficie lógica a la vez. BeginDraw devuelve un código de error si no se ha llamado a EndDraw o SuspendDraw después de una llamada anterior a BeginDraw. Una aplicación puede agregar una llamada confirmada a BeginDraw a un lote, pero no surte efecto hasta que se llame a EndDraw y se confirme.

Suspender actualizaciones en una superficie lógica

Una aplicación que necesita actualizar diferentes superficies puede llamar a SuspendDraw en la actualización actual y, a continuación, llamar a BeginDraw para comenzar una nueva actualización. Microsoft DirectComposition permite varias actualizaciones, pero solo una puede estar activa a la vez. Esto significa que debes llamar a SuspendDraw o EndDraw en una superficie antes de llamar a BeginDraw en la siguiente. A diferencia de EndDraw, un lote confirmado puede contener una superficie que se encuentra en un estado SuspendDraw , pero estas actualizaciones no se mostrarán en la pantalla hasta que se llame a EndDraw .

Reanudación de actualizaciones en una superficie lógica

Una aplicación puede reanudar una actualización de una superficie que se encuentra en un estado SuspendDraw llamando a ResumeDraw. Solo se puede llamar a este método en una superficie suspendida.

Finalización de actualizaciones en una superficie lógica

Llamar a EndDraw y Commit es la única manera de ver los cambios de actualización del mapa de bits en la pantalla. Cada llamada a EndDraw debe tener una llamada correspondiente a BeginDraw para quitar el rectángulo de protección. La superficie lógica conserva todas las actualizaciones hasta que se llama a Commit . También puede llamar a EndDraw en una superficie que se encuentra en el estado SuspendDraw porque EndDraw es un resume/end implícito. Después de llamar a EndDraw, el contenido actualizado se presenta a la pantalla y se descarta para que la memoria de la actualización se pueda reutilizar para una actualización posterior.

Ejemplo de uso de una superficie lógica

En el ejemplo siguiente se describen los pasos que realizaría una aplicación si crease un árbol visual formado por dos objetos visuales y, a continuación, era necesario actualizar regiones específicas de las dos superficies lógicas asociadas a los objetos visuales:

  1. Cree un dispositivo DirectComposition.
  2. Cree el árbol visual que consta de un nodo raíz y objetos visuales 1 y 2.
  3. Cree superficies lógicas 1 y 2.
  4. Llame a SetContent para asociar una superficie lógica con los objetos visuales 1 y 2.
  5. Llame a BeginDraw en un sub rectángulo de la superficie lógica 1.
  6. Actualice la superficie en el desplazamiento devuelto por DirectComposition.
  7. Pasos opcionales:
    1. Llama a SuspendDraw en la superficie lógica 1.
    2. Llame a BeginDraw en subrección de la superficie lógica 2.
    3. Actualice la superficie en el desplazamiento devuelto por DirectComposition.
    4. Llame a EndDraw en la superficie lógica 2.
    5. Llame a ResumeDraw en la superficie lógica 1.
  8. Actualice la superficie en el desplazamiento devuelto por DirectComposition.
  9. Llame a EndDraw en la superficie lógica 1.
  10. Confirmación de llamada.

Superficie virtual DirectComposition

DirectComposition expone la interfaz IDCompositionVirtualSurface para representar una superficie virtual, que es una colección de superficies lógicas (mosaicos) organizadas en una cuadrícula fija con mosaicos de un tamaño fijo. La aplicación especifica el tamaño de la textura virtual en el momento de la creación. El tamaño establece los límites de la superficie virtual. La superficie se puede asociar a uno o varios objetos visuales.

Cuando se inicializa una superficie virtual, no está respaldada por asignaciones reales. En otras palabras, no contiene ningún bits. DirectComposition asigna iconos (es decir, objetos de superficie de composición) después de que la aplicación empiece a actualizar la superficie. La aplicación actualiza la superficie virtual llamando a BeginDraw y especificando la región de interés con respecto a las coordenadas de la superficie virtual. Después, DirectComposition asigna los iconos necesarios para contener la actualización y devuelve la superficie de composición y el desplazamiento para actualizar.

Al igual que con las superficies lógicas, puede llamar a BeginDraw, SuspendDraw, ResumeDraw y EndDraw en una superficie virtual. Además, DirectComposition expone métodos que puede usar para cambiar el tamaño y recortar una superficie virtual existente.

Cambio de tamaño de una superficie virtual

El método Resize cambia los límites de la superficie virtual, lo que significa que las nuevas actualizaciones o asignaciones deben estar en los límites establecidos por el nuevo tamaño. Una aplicación usa Resize para indicar a DirectComposition que una región determinada de la superficie virtual ya no es necesaria y se puede reclamar. Si Resize reduce la superficie virtual, la aplicación ya no puede actualizar las regiones fuera de los nuevos límites.

En la ilustración siguiente se muestra una superficie virtual de 3 a 3 cuyo tamaño ha cambiado a 2 a 2. La región roja representa iconos que se descartan como parte de la operación de cambio de tamaño y DirectComposition reclama la memoria. Después del cambio de tamaño, la aplicación no puede realizar actualizaciones en la región roja sin volver a cambiar el tamaño de la superficie virtual.

cambio de tamaño de una superficie virtual

La operación de cambio de tamaño surte efecto inmediatamente. DirectComposition no espera a que la aplicación llame a Commit para realizar las actualizaciones de cambio de tamaño. Por ejemplo, supongamos que una aplicación realiza la siguiente secuencia de llamadas.

pVirtualSurface->Resize(0, 0);
pVirtualSurface->Resize(INT_MAX, INT_MAX);
pDevice->Commit();

En este ejemplo, la aplicación pierde todo el contenido del primer cambio de tamaño. El segundo cambio de tamaño no tiene ningún efecto aunque se haya llamado antes de Confirmar. En este caso, no se muestra nada en la pantalla.

Recorte de una superficie virtual

El método Trim identifica la región de la superficie virtual que necesita la aplicación. No cambia el tamaño de los límites de la superficie virtual, pero indica a DirectComposition qué superficies lógicas deben asignarse actualmente.

En la ilustración siguiente, el cuadrado verde es la ventanilla de la aplicación. La aplicación se representa inicialmente en los seis primeros iconos (azul) de la superficie virtual (gris claro) que se encuentran en la ventanilla. A medida que la página representada por la superficie virtual se desplaza, la aplicación debe representar los seis últimos iconos. La aplicación llama a Trim para indicar que la región definida por los últimos seis iconos es donde está el contenido y el resto no es necesario en este momento. DirectComposition puede optar por reciclar las superficies lógicas que representaron originalmente los seis primeros iconos (gris oscuro).

recorte de una superficie virtual

Conceptos de DirectComposition