Compartilhar via


Visão geral dos recursos

Um recurso Direct2D é um objeto usado para desenho e é representado por uma interface Direct2D, como ID2D1Geometry ou ID2D1RenderTarget. Este tópico descreve os tipos de recursos de Direct2D e como eles podem ser compartilhados.

Este tópico contém as seguintes seções:

Sobre recursos de Direct2D

Muitas APIs 2D aceleradas por hardware são projetadas em torno de um modelo de recurso focado em CPU e um conjunto de operações de renderização que funcionam bem em CPUs.Em seguida, parte da API é acelerada por hardware. Implementar essas APIs requer um gerenciador de recursos para mapear recursos de CPU para recursos na GPU. Devido a limitações de GPU, algumas operações podem não ser aceleradas em todas as circunstâncias. Nesses casos, o gerenciador de recursos deve se comunicar entre a CPU e a GPU (o que é caro) para que ele possa fazer a transição para a renderização da CPU. Em alguns casos, pode forçar imprevisívelmente a renderização a voltar completamente à CPU. Além disso, as operações de renderização que parecem simples podem exigir etapas de renderização intermediárias temporárias que não são expostas na API e que exigem recursos adicionais de GPU.

Direct2D fornece um mapeamento mais direto para fazer uso completo da GPU. Ele fornece duas categorias de recursos: independente do dispositivo e dependente do dispositivo.

  • Os recursos independentes do dispositivo, como ID2D1Geometry, são mantidos na CPU.
  • Recursos dependentes do dispositivo, como ID2D1RenderTarget e ID2D1LinearGradientBrush, mapeiam diretamente para recursos na GPU (quando a aceleração de hardware está disponível). As chamadas de renderização são executadas combinando informações de vértice e cobertura de uma geometria com informações de texturização produzidas pelos recursos dependentes do dispositivo.

Quando você cria recursos dependentes do dispositivo, os recursos do sistema (a GPU, se disponível ou a CPU) são alocados quando o dispositivo é criado e não são alterados de uma operação de renderização para outra. Essa situação elimina a necessidade de um gerenciador de recursos. Além das melhorias gerais de desempenho fornecidas pela eliminação de um gerenciador de recursos, esse modelo permite controlar diretamente qualquer renderização intermediária.

Como Direct2D fornece tanto controle sobre os recursos, você deve entender os diferentes tipos de recursos e quando eles podem ser usados juntos.

recursos do Device-Independent

Conforme descrito na seção anterior, os recursos independentes do dispositivo sempre residem na CPU e nunca são associados a um dispositivo de renderização de hardware. Veja a seguir os recursos independentes do dispositivo:

Use um ID2D1Factory, um recurso independente do dispositivo, para criar recursos independentes do dispositivo. (Para criar uma fábrica, use a função CreateFactory .)

Exceto para destinos de renderização, todos os recursos criados por uma fábrica são independentes do dispositivo. Um destino de renderização é um recurso dependente do dispositivo.

recursos do Device-Dependent

Qualquer recurso que não seja nomeado na lista anterior é um recurso dependente do dispositivo. Os recursos dependentes do dispositivo estão associados a um dispositivo de renderização específico. Quando a aceleração de hardware está disponível, esse dispositivo é a GPU. Em outros casos, é a CPU.

Para criar a maioria dos recursos dependentes do dispositivo, use um destino de renderização. Na maioria dos casos, use uma fábrica para criar um destino de renderização.

Veja a seguir exemplos de recursos dependentes do dispositivo:

  • ID2D1Brush e as interfaces que herdam dele. Use um destino de renderização para criar pincéis.
  • ID2D1Layer. Use um destino de renderização para criar camadas.
  • ID2D1RenderTarget e as interfaces que herdam dele. Para criar um destino de renderização, use uma fábrica ou outro destino de renderização.

Observação

Começando com Windows 8, há novas interfaces que criam recursos dependentes do dispositivo. Um ID2D1Device e um ID2D1DeviceContext poderão compartilhar um recurso se o contexto do dispositivo e o recurso forem criados a partir do mesmo ID2D1Device.

 

Os recursos dependentes do dispositivo tornam-se inutilizáveis quando os dispositivos de renderização associados ficam indisponíveis. Isso significa que, quando você recebe o erro D2DERR_RECREATE_TARGET para um destino de renderização, deve recriar o destino de renderização e todos os seus recursos.

Recursos da Fábrica de Compartilhamento

Você pode compartilhar todos os recursos independentes do dispositivo criados por uma fábrica com todos os outros recursos (independentes de dispositivo ou dependentes de dispositivo) criados pela mesma fábrica. Por exemplo, você pode usar dois objetos ID2D1RenderTarget para desenhar o mesmo ID2D1RectangleGeometry se ambos os objetos ID2D1RenderTarget foram criados pela mesma fábrica.

As interfaces do coletor (ID2D1SimplifiedGeometrySink, ID2D1GeometrySink e ID2D1TessellationSink) podem ser compartilhadas com recursos criados por qualquer fábrica. Ao contrário de outras interfaces em Direct2D, qualquer implementação de uma interface de coletor pode ser usada. Por exemplo, você pode usar sua própria implementação de ID2D1SimplifiedGeometrySink.

Compartilhamento de recursos de destino de renderização

Sua capacidade de compartilhar recursos criados por um destino de renderização depende do tipo de destino de renderização. Quando você cria um destino de renderização do tipo D2D1_RENDER_TARGET_TYPE_DEFAULT, os recursos criados por esse destino de renderização só podem ser usados por esse destino de renderização (a menos que o destino de renderização se encaixe em uma das categorias descritas nas seções a seguir). Isso ocorre porque você não sabe qual dispositivo o destino de renderização acabará usando— ele pode acabar renderizando para hardware local, software ou hardware de um cliente remoto. Por exemplo, você pode escrever um programa que para de funcionar quando ele é exibido remotamente ou quando o destino de renderização é aumentado de tamanho além do tamanho máximo suportado pelo hardware de renderização.

As seções a seguir descrevem as circunstâncias em que um recurso criado por um destino de renderização pode ser compartilhado com outro destino de renderização.

Destinos de renderização de hardware

Você pode compartilhar recursos entre qualquer destino de renderização que use explicitamente o hardware, desde que o modo de comunicação remota seja compatível. O modo de comunicação remota só tem a garantia de ser compatível quando ambos os destinos de renderização usam o sinalizador de uso D2D1_RENDER_TARGET_USAGE_FORCE_BITMAP_REMOTING ou D2D1_RENDER_TARGET_USAGE_GDI_COMPATIBLE ou se nenhum sinalizador for especificado. Essas configurações garantem que os recursos sempre estarão localizados no mesmo computador. Para especificar um modo de uso, defina o campo de uso da estrutura D2D1_RENDER_TARGET_PROPERTIES que você usou para criar o destino de renderização com um ou mais sinalizadores de D2D1_RENDER_TARGET_USAGE .

Para criar um destino de renderização que usa explicitamente a renderização de hardware, defina o campo tipo da estrutura D2D1_RENDER_TARGET_PROPERTIES que você usou para criar o destino de renderização para D2D1_RENDER_TARGET_TYPE_HARDWARE.

Destinos do Surface Render do DXGI

Você pode compartilhar recursos criados por um destino de renderização de superfície DXGI com qualquer outro destino de renderização de superfície DXGI que esteja usando o mesmo dispositivo Direct3D subjacente.

Destinos de renderização compatíveis e bitmaps compartilhados

Você pode compartilhar recursos entre um destino de renderização e destinos de renderização compatíveis criados por esse destino de renderização. Para criar um destino de renderização compatível, use o método ID2D1RenderTarget::CreateCompatibleRenderTarget .

Você pode usar o método ID2D1RenderTarget::CreateSharedBitmap para criar um ID2D1Bitmap que pode ser compartilhado entre os dois destinos de renderização especificados na chamada de método, se o método for bem-sucedido. Esse método terá êxito desde que os dois destinos de renderização usem o mesmo dispositivo subjacente para renderização.