Partilhar via


Superfície de composição

Observação

Para aplicativos no Windows 10, recomendamos o uso de APIs Windows.UI.Composition em vez de DirectComposition. Para saber mais, veja Modernizar seu aplicativo da área de trabalho usando a camada Visual.

Este tópico descreve os tipos de tipos de superfícies suportados pelo Microsoft DirectComposition.

Superfície lógica DirectComposition

DirectComposition expõe o IDCompositionSurface objeto para representar uma superfície de composição lógica. 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 elementos visuais. Um aplicativo é responsável por gerenciar a vida útil 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. DirectComposition aloca um retângulo do tamanho especificado e, em seguida, 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 limitados 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 de cada vez, apenas uma superfície lógica pode ser atualizada de cada 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 a BeginDraw a um lote, mas ela não terá efeito até que EndDraw seja chamada e confirmada.

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

Um aplicativo que precisa atualizar superfícies diferentes 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 de cada vez. Isso significa que você precisa chamar SuspendDraw ou EndDraw em uma superfície antes de chamar BeginDraw na próxima. Ao contrário 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.

Retomar 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. Este método só pode ser chamado numa superfície suspensa.

Encerrando atualizações em 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 de confirmação seja chamado. Você também pode chamar EndDraw em uma superfície que esteja no estado SuspendDraw porque EndDraw é um currículo/fim implícito. Depois de chamar EndDraw, o conteúdo atualizado é apresentado na tela e descartado para que a memória da atualização possa ser reutilizada para uma atualização posterior.

Exemplo de utilização de uma superfície lógica

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

  1. Crie um dispositivo DirectComposition.
  2. Crie a árvore visual que consiste em um nó raiz e os visuais 1 e 2.
  3. Crie superfícies lógicas 1 e 2.
  4. Chame SetContent para associar uma superfície lógica aos elementos 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 pelo DirectComposition.
  7. Passos opcionais:
    1. Chame SuspendDraw na superfície lógica 1.
    2. Chame BeginDraw no sub-recto da superfície lógica 2.
    3. Atualize a superfície no deslocamento retornado pelo 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 pelo DirectComposition.
  9. Chame EndDraw na superfície lógica 1.
  10. Ligue confirme.

Superfície virtual DirectComposition

DirectComposition expõe o IDCompositionVirtualSurface interface para representar uma superfície virtual, que é uma coleção de superfícies lógicas (blocos) organizadas em uma grade fixa com blocos de 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 elementos visuais.

Quando uma superfície virtual é inicializada, ela não é apoiada por alocações reais. Em outras palavras, ele não contém nenhum pedaç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, DirectComposition aloca os blocos necessários para manter a atualização e retorna a superfície de composição e o deslocamento para atualizar.

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

Redimensionamento de 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 estar dentro dos limites definidos pelo novo tamanho. Um aplicativo usa Redimensionar para informar ao DirectComposition que uma determinada região 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 3 por 3 redimensionada para 2 por 2. A região vermelha representa blocos que são 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 na 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 espera 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, apesar de ter sido chamado antes Commit. Neste caso, nada aparece na tela.

Aparar 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 precisam ser alocadas no momento.

Na ilustração a seguir, o quadrado verde é o visor do aplicativo. O aplicativo inicialmente renderiza para os primeiros seis blocos (azul) da superfície virtual (cinza claro) que estão no visor. À medida que a página representada pela superfície virtual rola, 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. DirectComposition pode então optar por reciclar as superfícies lógicas que originalmente representavam os primeiros seis blocos (cinza escuro).

cortar uma superfície virtual

Conceitos do DirectComposition