Considerações de desempenho e práticas recomendadas
Este tópico apresenta um conjunto de práticas recomendadas para usar as APIs do DWM (Gerenciador de Janelas da Área de Trabalho).
Este tópico contém as seguintes seções:
Práticas de aplicativo para DWM
Se o aplicativo manipular o dimensionamento de pontos por polegada (dpi), você poderá declarar um aplicativo como com reconhecimento de dpi e impedir o dimensionamento automático definindo o sinalizador com reconhecimento de dpi no manifesto do programa ou chamando a função SetProcessDPIAware durante a inicialização do programa.
Com a composição do DWM ativada, 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.
Janelas de WS_EX_TRANSPARENT de nível superior devem ser combinadas com um estilo WS_EX_LAYERED para fins de teste de clique. WS_EX_TRANSPARENT no sentido clássico, sem redirecionamento, é útil para janelas filho em uma hierarquia de janelas que pertencem ao mesmo thread, mas não se destina a janelas de nível superior.
Use regiões ou camadas para criar janelas formadas ou combinadas. Observe que, no Windows Vista e em versões posteriores do Windows, o desenho personalizado apenas parte de uma janela de nível superior não fornecerá o conteúdo obsoleto desejado em regiões não desenhadas.
APIs como GetDCOrgEx podem ser usadas para determinar determinados valores reais. Se você tiver um DC (contexto de dispositivo) 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 buffer traseiro para sua janela: (0, 0).
Quando tudo falhar, desabilite a renderização de janela chamando a função DwmSetWindowAttribute .
Práticas de desenho para DWM
Evite desenhar diretamente na superfície de exibição primária. Isso forçará o DWM a desabilitar a composição até que o aplicativo libere a superfície primária do dispositivo.
Avalie se seu aplicativo deve fornecer seu próprio buffer duplo. O DWM efetivamente dobra o conteúdo e apresenta a janela em um único quadro.
Evite ler ou gravar em um DC de exibição. Embora seja compatível com o DWM, não recomendamos isso 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 compatível com a API do Microsoft Win32, fazer isso pode fazer com que a janela perca qualquer borda de vidro que ela tenha.
Evite misturar a GDI (Interface do Dispositivo Gráfico do Windows) e o Microsoft DirectX, a menos que não se sobreponham. Se a combinação for necessária, desenhe o conteúdo GDI em uma superfície de software DirectX e combine-o antes de redigir para a tela ou desenhe-os em janelas separadas.
Use a função BitBlt ou StretchBlt em vez do Windows GDI+ para apresentar seu desenho para renderização. O GDI+ renderiza uma linha de verificação por vez com a renderização de software. Isso pode causar cintilação em seus aplicativos.
Região do cliente Blur-Behind DWM
Renderizar o efeito blur-behind é uma operação com uso intensivo de recursos para a CPU e a GPU (unidade de processamento gráfico). Os desenvolvedores de aplicativos são instados a considerar as implicações do uso do desfoque da área do cliente para que ele não consuma recursos excessivos. Você deve ter cuidado especial 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 precisa ser renderizado caso ocorram atualizações na área desfocada da janela, o que incorre em custos de CPU e GPU. Além disso, as operações de janela na janela (mover/redimensionar/transições) incorrerão em mais custos.
- Quando você espera atualizações significativas na área de cliente desfocada. Isso exigirá uma repinta do desfoque em cada atualização e consumirá recursos excessivos.
- Se o desfoque for esperado para cobrir uma área significativa e as atualizações para essa área também forem esperadas, recomendamos que você não desfoque a área do cliente.