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 Direct2D e como eles podem ser compartilhados.
Este tópico contém as seguintes seções:
- Sobre recursos Direct2D
- Device-Independent Recursos
- Device-Dependent Recursos
- Compartilhando recursos de fábrica
- compartilhamento de recursos de destino de renderização
Muitas APIs 2D aceleradas por hardware são projetadas em torno de um modelo de recursos focado na CPU e um conjunto de operações de renderização que funcionam bem em CPUs.Então, parte da API é acelerada por hardware. A implementação dessas APIs requer um gerenciador de recursos para mapear recursos da CPU para recursos na GPU. Devido às limitações da GPU, algumas operações podem não conseguir 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 possa fazer a transição para a renderização da CPU. Em alguns casos, pode, de forma imprevisível, forçar a renderização a recair completamente sobre a 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 da GPU.
O Direct2D fornece um mapeamento mais direto para fazer pleno uso da GPU. Ele fornece duas categorias de recursos: independente do dispositivo e dependente do dispositivo.
- Recursos independentes do dispositivo, como ID2D1Geometry, são mantidos na CPU.
- Recursos dependentes do dispositivo, como ID2D1RenderTarget e ID2D1LinearGradientBrush , são mapeados diretamente para recursos na GPU (quando a aceleração de hardware está disponível). As chamadas de renderização são realizadas 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 mudam de uma operação de renderização para outra. Esta situação elimina a necessidade de um gestor 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 o Direct2D fornece muito controle sobre os recursos, você deve entender os diferentes tipos de recursos e quando eles podem ser usados juntos.
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. A seguir estão os recursos independentes do dispositivo:
- ID2D1DrawingStateBlock
- ID2D1Factory
- ID2D1Geometry e as interfaces que herdam dele.
- ID2D1GeometrySink e ID2D1SimplifiedGeometrySink
- ID2D1StrokeStyle
Use uma ID2D1Factory , que é em si um recurso independente do dispositivo, para criar recursos independentes do dispositivo. (Para criar uma fábrica, use a funçãoCreateFactory.)
Com exceção dos 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.
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.
Seguem-se 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.
Nota
A partir do Windows 8, há novas interfaces que criam recursos dependentes do dispositivo. Um ID2D1Device e um ID2D1DeviceContext podem partilhar 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, ao receber o erro de D2DERR_RECREATE_TARGET para um destino de renderização, você deve recriar o destino de renderização e todos os seus recursos.
Você pode compartilhar todos os recursos independentes de dispositivo criados por uma fábrica com todos os outros recursos (independentes do dispositivo ou dependentes do dispositivo) criados pela mesma fábrica. Por exemplo, você pode usar dois objetos ID2D1RenderTarget para desenhar o mesmo ID2D1RectangleGeometry se ambos os objetos ID2D1RenderTarget tiverem sido criados pela mesma fábrica.
As interfaces do coletor (ID2D1SimplifiedGeometrySink, ID2D1GeometrySinke 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 sink pode ser usada. Por exemplo, pode utilizar a sua própria implementação de ID2D1SimplifiedGeometrySink.
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 é exibido remotamente ou quando o destino de renderização é aumentado em tamanho além do tamanho máximo suportado pelo hardware de renderização.
As seções a seguir descrevem as circunstâncias sob as quais um recurso criado por um destino de renderização pode ser compartilhado com outro destino de renderização.
Você pode compartilhar recursos entre qualquer alvo de renderização que use explicitamente hardware, desde que o modo de remotização seja compatível. O modo de comunicação remota só é garantido como compatível quando ambos os destinos de renderização utilizam o sinalizador de uso D2D1_RENDER_TARGET_USAGE_FORCE_BITMAP_REMOTING ou D2D1_RENDER_TARGET_USAGE_GDI_COMPATIBLE, ou se nenhum sinalizador estiver especificado. Essas configurações garantem que os recursos estarão sempre localizados no mesmo computador. Para especificar um modo de uso, defina o campo de de uso da estrutura de 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 use explicitamente a renderização de hardware, defina o tipo campo da estrutura de D2D1_RENDER_TARGET_PROPERTIES que você usou para criar o destino de renderização como D2D1_RENDER_TARGET_TYPE_HARDWARE.
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.
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 ID2D1RenderTarget::CreateCompatibleRenderTarget método.
Você pode usar o método ID2D1RenderTarget::CreateSharedBitmap para criar umID2D1Bitmapque pode ser compartilhado entre os dois destinos de renderização especificados na chamada do método, se o método for bem-sucedido. Esse método será bem-sucedido desde que os dois destinos de renderização usem o mesmo dispositivo subjacente para renderização.