Partilhar via


Superfície de composição

Observação

Para aplicativos em Windows 10, recomendamos usar APIs Windows.UI.Composition em vez de DirectComposition. Para obter mais informações, consulte Modernizar seu aplicativo da área de trabalho usando a camada Visual.

Este tópico descreve os tipos de superfícies compatíveis com o Microsoft DirectComposition.

Superfície lógica do DirectComposition

O DirectComposition expõe o objeto IDCompositionSurface para representar uma superfície de composição lógica. O DirectComposition expõe APIs que você pode usar para criar, atualizar e excluir essas superfícies lógicas. Cada superfície pode ser associada a um ou mais visuais. Um aplicativo é responsável por gerenciar o tempo de vida das superfícies lógicas.

Atualizando uma superfície lógica

Um aplicativo pode atualizar uma superfície lógica chamando BeginDraw e especificando o tamanho e o deslocamento do retângulo na superfície lógica que o aplicativo deseja atualizar. O DirectComposition aloca um retângulo do tamanho especificado e retorna a superfície e o deslocamento correspondente que o aplicativo precisa desenhar ou atualizar. Os limites do retângulo de atualização são associados pelo tamanho da superfície. Por exemplo, o retângulo de atualização para uma superfície de 40 por 100 pixels pode ser de até (0,0,40,100). Além disso, a região atualizável é imposta por um retângulo de proteção. Como só pode haver um retângulo de proteção por vez, apenas uma superfície lógica pode ser atualizada por vez. BeginDraw retornará um código de erro se EndDraw ou SuspendDraw não tiver sido chamado após uma chamada anterior para BeginDraw. Um aplicativo pode adicionar uma chamada confirmada ao BeginDraw a um lote, mas ele não entrará em vigor até que EndDraw seja chamado e confirmado.

Suspender atualizações em uma superfície lógica

Um aplicativo que precisa atualizar diferentes superfícies pode chamar SuspendDraw na atualização atual e, em seguida, chamar BeginDraw para iniciar uma nova atualização. O Microsoft DirectComposition permite várias atualizações, mas apenas uma pode estar ativa por vez. Isso significa que você precisa chamar SuspendDraw ou EndDraw em uma superfície antes de chamar BeginDraw na próxima. Ao contrário de EndDraw, um lote confirmado pode conter uma superfície que está em um estado SuspendDraw , mas essas atualizações não serão mostradas na tela até que EndDraw seja chamado.

Retomando atualizações para uma superfície lógica

Um aplicativo pode retomar uma atualização para uma superfície que está em um estado SuspendDraw chamando ResumeDraw. Esse método só pode ser chamado em uma superfície suspensa.

Fim das atualizações para uma superfície lógica

Chamar EndDraw e Commit é a única maneira de ver as alterações de atualização de bitmap na tela. Cada chamada para EndDraw deve ter uma chamada correspondente para BeginDraw para remover o retângulo de proteção. A superfície lógica retém todas as atualizações até que Commit seja chamado. Você também pode chamar EndDraw em uma superfície que está no estado SuspendDraw porque EndDraw é um currículo/fim implícito. Depois de chamar EndDraw, o conteúdo atualizado será apresentado à tela e descartado para que a memória da atualização possa ser reutilizado para uma atualização posterior.

Exemplo de como usar uma superfície lógica

O exemplo a seguir descreve as etapas que um aplicativo executaria se criasse uma árvore visual composta por dois visuais e, em seguida, precisasse atualizar regiões específicas das duas superfícies lógicas associadas aos visuais:

  1. Crie um dispositivo DirectComposition.
  2. Crie a árvore visual que consiste em um nó raiz e visuais 1 e 2.
  3. Crie superfícies lógicas 1 e 2.
  4. Chame SetContent para associar uma superfície lógica aos visuais 1 e 2.
  5. Chame BeginDraw em um sub-retângulo da superfície lógica 1.
  6. Atualize a superfície no deslocamento retornado por DirectComposition.
  7. Etapas opcionais:
    1. Chame SuspendDraw na superfície lógica 1.
    2. Chame BeginDraw na sub-rect da superfície lógica 2.
    3. Atualize a superfície no deslocamento retornado por DirectComposition.
    4. Chame EndDraw na superfície lógica 2.
    5. Chame ResumeDraw na superfície lógica 1.
  8. Atualize a superfície no deslocamento retornado por DirectComposition.
  9. Chame EndDraw na superfície lógica 1.
  10. Chamar Commit.

Superfície virtual do DirectComposition

O DirectComposition expõe a interface IDCompositionVirtualSurface para representar uma superfície virtual, que é uma coleção de superfícies lógicas (blocos) organizadas em uma grade fixa com blocos de um tamanho fixo. O aplicativo especifica o tamanho da textura virtual no momento da criação. O tamanho estabelece os limites para a superfície virtual. A superfície pode ser associada a um ou mais visuais.

Quando uma superfície virtual é inicializada, ela não é apoiada por alocações reais. Em outras palavras, ele não contém nenhum bit. O DirectComposition aloca blocos (ou seja, objetos de superfície de composição) depois que o aplicativo começa a atualizar a superfície. O aplicativo atualiza a superfície virtual chamando BeginDraw e especificando a região de interesse em relação às coordenadas da superfície virtual. Em seguida, o DirectComposition aloca os blocos necessários para manter a atualização e retorna a superfície de composição e o deslocamento para atualização.

Assim como acontece com superfícies lógicas, você pode chamar BeginDraw, SuspendDraw, ResumeDraw e EndDraw em uma superfície virtual. Além disso, o DirectComposition expõe métodos que você pode usar para redimensionar e cortar uma superfície virtual existente.

Redimensionando uma superfície virtual

O método Resize altera os limites da superfície virtual, o que significa que quaisquer novas atualizações ou alocações devem cair nos limites definidos pelo novo tamanho. Um aplicativo usa o Redimensionamento para informar ao DirectComposition que uma região específica da superfície virtual não é mais necessária e pode ser recuperada. Se Redimensionar reduzir a superfície virtual, o aplicativo não poderá mais atualizar as regiões fora dos novos limites.

A ilustração a seguir mostra uma superfície virtual de 3 por 3 redimensionada para 2 por 2. A região vermelha representa blocos descartados como parte da operação de redimensionamento e a memória é recuperada pelo DirectComposition. Após o redimensionamento, o aplicativo não pode fazer atualizações para a região vermelha sem redimensionar a superfície virtual novamente.

redimensionar uma superfície virtual

A operação de redimensionamento entra em vigor imediatamente. O DirectComposition não aguarda que o aplicativo chame Commit para fazer as atualizações de redimensionamento. Por exemplo, suponha que um aplicativo faça a seguinte sequência de chamadas.

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

Neste exemplo, o aplicativo perde todo o conteúdo no primeiro redimensionamento. O segundo redimensionamento não tem efeito, embora tenha sido chamado antes de Commit. Nesse caso, nada é exibido na tela.

Cortar uma superfície virtual

O método Trim identifica a região da superfície virtual de que o aplicativo precisa. Ele não redimensiona os limites da superfície virtual, mas informa ao DirectComposition quais superfícies lógicas atualmente precisam ser alocadas.

Na ilustração a seguir, o quadrado verde é o visor do aplicativo. O aplicativo renderiza inicialmente para os seis primeiros blocos (azul) da superfície virtual (cinza claro) que estão no visor. Como a página representada pelas rolagens da superfície virtual, o aplicativo precisa renderizar os últimos seis blocos. O aplicativo chama Trim para indicar que a região definida pelos últimos seis blocos é onde o conteúdo está e o restante não é necessário no momento. O DirectComposition pode optar por reciclar as superfícies lógicas que representaram originalmente os seis primeiros blocos (cinza escuro).

cortar uma superfície virtual

Conceitos do DirectComposition