Prestatieoverwegingen en aanbevolen procedures
In dit onderwerp vindt u een aantal aanbevolen procedures voor het gebruik van DWM-API's (Desktop Window Manager).
Dit onderwerp bevat de volgende secties:
Toepassingsprocedures voor DWM
Als uw toepassing dots per inch (dpi) schaalt, kunt u een toepassing declareren als dpi-bewust en automatisch schalen voorkomen door de dpi-bewuste vlag in het manifest van het programma in te stellen of door de SetProcessDPIAware- functie aan te roepen tijdens de initialisatie van het programma.
Als DWM-samenstelling is ingeschakeld, ontvangen verborgen toepassingen geen WM_PAINT berichten meer en worden ze niet gevraagd om opnieuw te renderen. De inhoud van elk venster is al beschikbaar voor het opstellen van de schermafbeelding.
WS_EX_TRANSPARENT vensters op het hoogste niveau moeten worden gecombineerd met een WS_EX_LAYERED stijl voor het hit-testen. WS_EX_TRANSPARENT in de klassieke zin, zonder omleiding, is handig voor onderliggende vensters in een hiërarchie van vensters die deel uitmaken van dezelfde thread, maar is niet bedoeld voor vensters op het hoogste niveau.
Gebruik regio's of lagen om gevormde of gemengde vensters te maken. Houd er rekening mee dat op Windows Vista en latere versies van Windows het aanpassen van de tekening van slechts een deel van een toplevel venster de gewenste overtollige inhoud in ongetekende regio's niet zal opleveren.
API's zoals GetDCOrgEx- kunnen worden gebruikt om bepaalde werkelijke waarden te bepalen. Als u een apparaatcontext (DC) hebt voor een omgeleid venster, komt de oorsprong die wordt geretourneerd door GetDCOrgEx- niet overeen met de oorsprong van het venster op het scherm. De oorsprong is in plaats daarvan de oorsprong van het achterbufferoppervlak voor uw venster: (0, 0).
Wanneer alles mislukt, schakelt u vensterweergave uit door de DwmSetWindowAttribute--functie aan te roepen.
Tekentechnieken voor DWM
Vermijd het rechtstreeks tekenen op het primaire beeldschermoppervlak. Als u dit doet, wordt DWM gedwongen de samenstelling uit te schakelen totdat uw toepassing het primaire apparaatoppervlak vrijgeeft.
Evalueer of uw toepassing een eigen dubbele buffer moet bieden. De DWM maakt effectief gebruik van dubbele buffering voor inhoud en presenteert het venster in één frame.
Vermijd lezen van of schrijven naar een display-DC. Hoewel dit wordt ondersteund door DWM, raden we dit niet aan vanwege verminderde prestaties.
Vermijd tekenen in het niet-klantgebied. Hoewel dit gebied toegankelijk is voor de toepassing en tekenen daar wordt ondersteund door de Microsoft Win32 API, kan dit ertoe leiden dat het venster zijn glazen rand verliest.
Vermijd het combineren van Windows Graphics Device Interface (GDI) en Microsoft DirectX, tenzij ze elkaar niet overlappen. Als menging nodig is, tekent u de GDI-inhoud in een DirectX-softwareoppervlak en combineert u deze voordat u ze naar het scherm samenstelt, of tekent u ze in afzonderlijke vensters.
Gebruik BitBlt- of StretchBlt functie in plaats van Windows GDI+ om uw tekening voor rendering weer te geven. GDI+ geeft één scanregel tegelijk weer met software-rendering. Dit kan leiden tot flikkering in uw toepassingen.
DWM Blur-Behind Clientregio
Het weergeven van het vervaagde effect is een resource-intensieve bewerking voor zowel de CPU als de GPU (Graphics Processing Unit). Toepassingsontwikkelaars worden opgeroepen om rekening te houden met de gevolgen van het gebruik van vervaagd clientgebied, zodat deze geen overmatige resources verbruikt. In de volgende gevallen moet u met name voorzichtig zijn:
- Wanneer u verwacht dat de waas van de clientzone aanzienlijk is, zelfs als er geen updates plaatsvinden in het gebied zelf dat wazig is. De vervaging moet worden weergegeven voor het geval dat er updates optreden onder het wazige deel van het venster, wat CPU- en GPU-kosten veroorzaakt. Daarnaast zullen bewerkingen aan het venster (verplaatsen, vergroten, verkleinen, overgangen) meer kosten met zich meebrengen.
- Wanneer u belangrijke updates verwacht in het wazige clientgebied. Dit vereist een hervervaging van elke update en verbruikt overmatige resources.
- Als de vervaging naar verwachting een belangrijk gebied omvat en updates voor dat gebied ook worden verwacht, raden we u ten zeere aan dat u het clientgebied niet vervaagt.