Partilhar via


Considerações de desempenho e práticas recomendadas

Este tópico apresenta um conjunto de práticas recomendadas para usar as APIs do Desktop Window Manager (DWM).

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

Práticas de aplicação para DWM

Se a sua aplicação manipula a escala de pontos por polegada (dpi), pode declarar uma aplicação como compatível com DPI e impedir a escala automática definindo o indicador de reconhecimento de DPI no manifesto do programa ou chamando a função SetProcessDPIAware durante a inicialização do programa.

Com a composição DWM ativada, os aplicativos obscurecidos não recebem mais mensagens WM_PAINT e não são solicitados a renderizar novamente. O conteúdo de cada janela já está disponível para compor a imagem da tela.

Para fins de teste de acertos, as janelas de nível superior WS_EX_TRANSPARENT devem ser combinadas com um estilo WS_EX_LAYERED. WS_EX_TRANSPARENT no sentido clássico, sem redirecionamento, é útil para janelas subordinadas numa hierarquia de janelas que faz parte da mesma thread, mas não se destina a janelas de topo.

Use regiões ou camadas para criar janelas moldadas ou misturadas. Observe que, no Windows Vista e em versões posteriores do Windows, o desenho personalizado de apenas parte de uma janela de nível superior não apresentará o conteúdo pré-existente desejado nas regiões não desenhadas.

APIs como GetDCOrgEx podem ser usadas para determinar determinados valores reais. Se você tiver um contexto de dispositivo (DC) para uma janela redirecionada, a origem retornada por GetDCOrgEx não corresponderá à origem da janela na tela. Em vez disso, a origem será a origem da superfície de back-buffer da sua janela: (0, 0).

Quando tudo falhar, desative a renderização da janela chamando a funçãoDwmSetWindowAttribute.

Práticas de desenho para DWM

Evite desenhar diretamente para a superfície de visualização principal. Fazer isso forçará o DWM a desativar a composição até que a sua aplicação liberte a superfície principal do dispositivo.

Avalie se seu aplicativo deve fornecer seu próprio buffer duplo. O DWM efetivamente armazena o conteúdo em buffer duplo e apresenta a janela num único frame.

Evite ler ou escrever em um DC de exibição. Embora suportado pelo DWM, não o recomendamos devido à diminuição do desempenho.

Evite desenhar na área não cliente. Embora essa área possa ser acessada pelo aplicativo, e o desenho lá seja suportado pela API do Microsoft Win32, fazer isso pode fazer com que a janela perca qualquer borda de vidro que ela tenha.

Evite misturar Windows Graphics Device Interface (GDI) e Microsoft DirectX, a menos que eles não se sobreponham. Se a mistura for necessária, desenhe o conteúdo GDI em uma superfície de software DirectX e combine-os antes de compor na tela, ou então desenhe-os em janelas separadas.

Use a função BitBlt ou a função StretchBlt em vez do Windows GDI+ para apresentar o seu desenho para renderização. GDI+ renderiza cada linha de varredura de cada vez através de processamento por software. Isso pode causar cintilação em seus aplicativos.

DWM Blur-Behind Região do Cliente

A renderização do efeito de desfoque de fundo é uma operação intensiva em recursos tanto para a CPU quanto para a unidade de processamento gráfico (GPU). Os desenvolvedores de aplicativos são instados a considerar as implicações do uso do blur de área do cliente para que ele não consuma recursos excessivos. Deve ter especial cuidado nos seguintes casos:

  • Quando você espera que o tamanho do desfoque da área do cliente seja significativo, mesmo que nenhuma atualização ocorra na própria área desfocada. O desfoque tem de ser renderizado caso ocorram atualizações debaixo da área desfocada da janela, o que resulta em custos para o CPU e a GPU. Além disso, as operações na janela (mover/redimensionar/transições) terão custos adicionais.
  • Quando se esperam atualizações significativas na área do utilizador desfocada. Isso exigirá uma repintura do desfoque em cada atualização e consumirá recursos excessivos.
  • Caso se espere que o desfoque cubra uma área significativa e se prevejam também atualizações nessa área, recomendamos fortemente que evite desfocar a zona do cliente.