Udostępnij za pośrednictwem


Zagadnienia dotyczące wydajności i najlepsze rozwiązania

W tym temacie przedstawiono zestaw najlepszych rozwiązań dotyczących korzystania z interfejsów API programu Desktop Window Manager (DWM).

Ten temat zawiera następujące sekcje:

Praktyki dotyczące aplikacji dla usługi DWM

Jeśli aplikacja obsługuje skalowanie kropek na cal (dpi), możesz zadeklarować aplikację jako z obsługą dpi i zapobiec automatycznemu skalowaniu, ustawiając flagę dpi-aware w manifeście programu lub wywołując funkcję SetProcessDPIAware podczas inicjowania programu.

Po włączeniu kompozycji DWM ukryte aplikacje nie odbierają już komunikatów WM_PAINT i nie są monitowane o ponowne renderowanie. Zawartość każdego okna jest już dostępna do tworzenia obrazu ekranu.

Okna WS_EX_TRANSPARENT najwyższego poziomu powinny być łączone ze stylem WS_EX_LAYERED na potrzeby testowania trafień. WS_EX_TRANSPARENT w klasycznym sensie, bez przekierowania, jest przydatny w przypadku okien podrzędnych w hierarchii okien należących do tego samego wątku, ale nie jest przeznaczony dla okien najwyższego poziomu.

Użyj regionów lub warstw do tworzenia kształtowanych lub mieszanych okien. Należy pamiętać, że w systemie Windows Vista i nowszych wersjach, rysowanie tylko części okna najwyższego poziomu nie zapewni zamierzonej nieaktualnej zawartości w obszarach, które nie są rysowane.

Interfejsy API, takie jak GetDCOrgEx, mogą służyć do określania określonych wartości rzeczywistych. Jeśli masz kontekst urządzenia (DC) dla przekierowanego okna, punkt odniesienia zwrócony przez GetDCOrgEx nie będzie zgodny z punktem odniesienia Twojego okna na ekranie. Źródłem będzie powierzchnia bufora tylnego dla twojego okna: (0, 0).

Gdy wszystkie inne elementy kończą się niepowodzeniem, wyłącz renderowanie okien przez wywołanie funkcjiDwmSetWindowAttribute.

Praktyki rysunkowe dla DWM

Unikaj rysowania bezpośrednio na powierzchni ekranu podstawowego. Wymusi to, że usługa DWM zablokuje kompozycję do momentu, gdy aplikacja zwolni powierzchnię urządzenia podstawowego.

Oceń, czy aplikacja musi zapewnić własne podwójne buforowanie. Usługa DWM skutecznie realizuje podwójne buforowanie zawartości i prezentuje okno w jednej ramce.

Unikaj odczytywania lub zapisywania do wyświetlanego kontrolera domeny. Mimo że jest obsługiwana przez usługę DWM, nie zalecamy jej z powodu zmniejszonej wydajności.

Unikaj rysowania w obszarze nieklienckim. Mimo że do tego obszaru można uzyskać dostęp za pomocą aplikacji, a rysowanie jest obsługiwane przez interfejs API Microsoft Win32, może to spowodować utratę szklanego obramowania przez okno.

Unikaj mieszania interfejsu GDI (Windows Graphics Device Interface) i Microsoft DirectX, chyba że nie nakładają się na siebie. Jeśli mieszanie jest konieczne, narysuj zawartość GDI na powierzchnię oprogramowania DirectX i połącz je przed skomponowaniem na ekranie lub narysuj je w oddzielnych oknach.

Użyj funkcji BitBlt lub StretchBlt zamiast funkcji GDI+ systemu Windows, aby przedstawić rysunek do renderowania. Interfejs GDI+ przetwarza jeden wiersz skanowania naraz przy użyciu oprogramowania do renderowania. Może to spowodować migotanie w aplikacjach.

DWM Blur-Behind Region Klienta

Renderowanie efektu rozmycia za obiektami jest operacją intensywnie wykorzystującą zasoby zarówno procesora (CPU), jak i jednostki przetwarzania grafiki (GPU). Deweloperzy aplikacji są zachęcani do rozważenia implikacji używania rozmycia obszaru klienta, żeby nie zużywało nadmiernych zasobów. Należy zachować szczególną ostrożność w następujących przypadkach:

  • Jeśli spodziewasz się, że efekt rozmycia obszaru okna aplikacji będzie znaczący, nawet jeśli w samym obszarze rozmytym nie nastąpią żadne aktualizacje. Rozmycie musi być renderowane, w razie aktualizacji pod rozmytym obszarem okna, co wiąże się z kosztami CPU i GPU. Ponadto operacje na oknie (przenoszenie/zmienianie rozmiaru/przejścia) będą generować większe koszty.
  • Jeśli spodziewasz się znaczących aktualizacji w rozmytym obszarze klienta. Będzie to wymagało ponownego rozmycia każdej aktualizacji i użycia nadmiernych zasobów.
  • Jeśli oczekuje się, że rozmycie obejmie znaczący obszar, a aktualizacje tego obszaru są również oczekiwane, zdecydowanie zalecamy, aby nie rozmyć obszaru klienta.