Partilhar via


Considerações de desempenho para interoperabilidade Direct3D9 e WPF

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

Observação

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

Use o D3DImage com moderação

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

Práticas recomendadas no Windows Vista

Para obter o melhor desempenho no Windows Vista com um monitor configurado para usar o WDDM (Windows Display Driver Model), crie sua superfície Direct3D9 em um IDirect3DDevice9Ex dispositivo. Isso permite o compartilhamento de superfície. A placa de vídeo deve suportar os recursos do controlador D3DDEVCAPS2_CAN_STRETCHRECT_FROM_TEXTURES e D3DCAPS2_CANSHARERESOURCE no Windows Vista. Quaisquer outras configurações fazem com que a superfície seja copiada através de software, o que reduz significativamente o desempenho.

Observação

Se o Windows Vista tiver um ecrã configurado para utilizar o Windows XP Display Driver Model (XDDM), a superfície é sempre copiada através de software, independentemente das definições. Com as configurações e a placa de vídeo adequadas, você verá um melhor desempenho no Windows Vista quando usar o WDDM porque as cópias de superfície são executadas no hardware.

Práticas recomendadas no Windows XP

Para obter o melhor desempenho no Windows XP, que usa o Windows XP Display Driver Model (XDDM), crie uma superfície bloqueável que se comporte corretamente quando o IDirect3DSurface9::GetDC método é chamado. Internamente, o método transfere BitBlt a superfície entre dispositivos de hardware. O GetDC método 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ó funciona em superfícies ARGB. A placa gráfica deve suportar a capacidade do driver D3DDEVCAPS2_CAN_STRETCHRECT_FROM_TEXTURES.

Uma profundidade de ecrã de ambiente de trabalho de 16 bits pode reduzir significativamente o desempenho. Recomenda-se um ambiente de trabalho de 32 bits.

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 Windows Vista WDDM, 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.

Observação

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

Melhores Práticas Gerais

Ao criar o dispositivo, use o sinalizador de criação D3DCREATE_MULTITHREADED. Isso reduz a performance, mas o sistema de renderização WPF chama métodos neste dispositivo a partir de um processo paralelo. Certifique-se de seguir o protocolo de bloqueio corretamente, para que não haja dois threads acessando o dispositivo ao mesmo tempo.

Se a renderização for processada em um thread gerido pelo WPF, é altamente recomendável que 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.

Azulejar um D3DImage é rápido, a menos que você azuleje uma superfície não-pow2 sem suporte de hardware, ou se azulejar um DrawingBrush ou VisualBrush que contenha uma superfície D3DImage.

Práticas recomendadas para ecrãs multi-monitores

Se estiver a utilizar um computador com vários monitores, deve seguir 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 traseiro, ele é criado em um dispositivo específico e adaptador, mas 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 com um dispositivo IDirect3DDevice9Ex, se o buffer frontal estiver num adaptador diferente, mas ainda na mesma placa de vídeo, não haverá penalidade de desempenho. No entanto, no Windows XP e no XDDM com várias placas de vídeo, há uma penalidade de desempenho significativa quando o buffer frontal é exibido em um adaptador diferente do buffer traseiro. Para obter mais informações, consulte Interoperação WPF e Direct3D9.

Resumo do desempenho

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

Formato de píxeis do Surface Windows Vista, WDDM e 9Ex Outras configurações do Windows Vista Windows XP SP3 ou SP2 com hotfix Janelas 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

Ver também