Compartilhar via


Considerações de desempenho para a interoperabilidade do Direct3D9 e do WPF

Você pode hospedar o conteúdo do Direct3D9 usando a classe D3DImage. Hospedar conteúdo do Direct3D9 pode afetar o desempenho do aplicativo. Este tópico descreve as práticas recomendadas para otimizar o desempenho ao hospedar conteúdo do Direct3D9 em um aplicativo do WPF (Windows Presentation Foundation). Essas práticas recomendadas incluem como usar D3DImage e práticas recomendadas quando você estiver usando exibições do Windows Vista, do Windows XP e de vários monitores.

Nota

Para ver exemplos de códigos que demonstram essas práticas recomendadas, consulte Interoperação Direct3D9 e WPF.

Usar D3DImage com moderação

O conteúdo direct3D9 hospedado em uma instância de D3DImage não é renderizado tão rápido quanto em um aplicativo Direct3D puro. Copiar a superfície e esvaziar o buffer de comando pode ser operações dispendiosas. À medida que o número de instâncias de D3DImage aumenta, ocorre mais descarregamento e o desempenho se degrada. Portanto, você deve usar D3DImage com moderação.

Práticas recomendadas no Windows Vista

Para obter o melhor desempenho no Windows Vista com uma exibição configurada para usar o WDDM (Modelo de Driver de Exibição do Windows), crie sua superfície Direct3D9 em um dispositivo IDirect3DDevice9Ex. Isso permite o compartilhamento de superfície. A placa de vídeo deve dar suporte aos recursos de driver D3DDEVCAPS2_CAN_STRETCHRECT_FROM_TEXTURES e D3DCAPS2_CANSHARERESOURCE no Windows Vista. Qualquer outra configuração faz com que a superfície seja copiada por meio de software, o que reduz significativamente o desempenho.

Nota

Se o Windows Vista tiver uma exibição configurada para usar o XDDM (Modelo de Driver de Exibição do Windows XP), a superfície sempre será copiada por meio de software, independentemente das configurações. Com as configurações adequadas e a placa de vídeo, você verá um melhor desempenho no Windows Vista quando usar o WDDM porque as cópias de superfície são executadas em hardware.

Práticas recomendadas no Windows XP

Para obter o melhor desempenho no Windows XP, que usa o XDDM (Modelo de Driver de Exibição do Windows XP), crie uma superfície bloqueável que se comporta corretamente quando o método IDirect3DSurface9::GetDC é chamado. Internamente, o método BitBlt transfere a superfície em todos os dispositivos do hardware. O método GetDC sempre funciona em superfícies XRGB. No entanto, se o computador cliente estiver executando o Windows XP com SP3 ou SP2 e se o cliente também tiver o hotfix para o recurso de janela em camadas, esse método só funcionará em superfícies ARGB. A placa de vídeo deve dar suporte à funcionalidade do driver D3DDEVCAPS2_CAN_STRETCHRECT_FROM_TEXTURES.

Uma profundidade de exibição da área de trabalho de 16 bits pode reduzir significativamente o desempenho. Um desktop de 32 bits é recomendado.

Se você estiver desenvolvendo para Windows Vista e Windows XP, teste o desempenho no Windows XP. Ficar sem memória de vídeo no Windows XP é uma preocupação. Além disso, D3DImage no Windows XP usa mais memória de vídeo e largura de banda do que o WDDM do Windows Vista, devido a uma cópia de memória de vídeo extra necessária. Portanto, você pode esperar que o desempenho seja pior no Windows XP do que no Windows Vista para o mesmo hardware de vídeo.

Nota

O XDDM está disponível no Windows XP e no Windows Vista; no entanto, o WDDM só está disponível no Windows Vista.

Práticas recomendadas gerais

Ao criar o dispositivo, use o sinalizador de criação D3DCREATE_MULTITHREADED. Isso reduz o desempenho, mas o sistema de renderização do WPF chama métodos neste dispositivo de outro thread. Siga o protocolo de bloqueio corretamente para que nenhum dos dois threads acesse o dispositivo ao mesmo tempo.

Se a renderização for executada em um thread gerenciado do WPF, é altamente recomendável que você crie o dispositivo com o sinalizador de criação D3DCREATE_FPU_PRESERVE. Sem essa configuração, a renderização D3D pode reduzir a precisão das operações de precisão dupla do WPF e introduzir problemas de renderização.

Organizar D3DImage lado a lado é rápido, a menos que você faça isso em uma superfície não pow2 sem suporte de hardware adequado, ou se você organizar lado a lado um DrawingBrush ou VisualBrush que contém um D3DImage.

Práticas recomendadas para exibições de vários monitores

Se você estiver usando um computador que tenha vários monitores, siga as práticas recomendadas descritas anteriormente. Há também algumas considerações adicionais de desempenho para uma configuração de vários monitores.

Quando você cria o buffer de fundo, ele é criado em um dispositivo e adaptador específicos, mas o WPF pode exibir o buffer frontal em qualquer adaptador. Copiar entre adaptadores para atualizar o buffer frontal pode ser muito caro. No Windows Vista, que está configurado para usar o WDDM com várias placas de vídeo e um dispositivo IDirect3DDevice9Ex, se o buffer frontal estiver em um adaptador diferente, mas ainda for a mesma placa de vídeo, não haverá nenhuma penalidade de desempenho. No entanto, no Windows XP e no XDDM com várias placas de vídeo, há uma perda de desempenho significativa quando o buffer frontal é exibido em um adaptador diferente do buffer traseiro. Para obter mais informações, consulte Interoperação Direct3D9 e WPF.

Resumo de Desempenho

A tabela a seguir mostra o desempenho da atualização do buffer frontal em função do sistema operacional, formato de pixel e bloqueio de superfície. Supõe-se que o buffer frontal e o buffer traseiro estejam no mesmo adaptador. Dependendo da configuração do adaptador, as atualizações de hardware geralmente são muito mais rápidas do que as atualizações de software.

Formato de pixel da superfície Windows Vista, WDDM e 9Ex Outras configurações do Windows Vista Windows XP SP3 ou SP2 com hotfix Windows XP SP2
D3DFMT_X8R8G8B8 (não bloqueável) Atualização de Hardware Atualização de software Atualização de software Atualização de software
D3DFMT_X8R8G8B8 (bloqueável) Atualização de Hardware Atualização de software Atualização de Hardware Atualização de Hardware
D3DFMT_A8R8G8B8 (não bloqueável) Atualização de Hardware Atualização de software Atualização de software Atualização de software
D3DFMT_A8R8G8B8 (bloqueável) Atualização de Hardware Atualização de software Atualização de Hardware Atualização de software

Consulte também