Рекомендации и аспекты производительности
В этом разделе представлен набор рекомендаций по использованию API диспетчера окон рабочего стола (DWM).
В этом разделе содержатся следующие разделы:
Методики приложений для DWM
Если приложение обрабатывает масштабирование точек на дюйм (dpi), вы можете объявить приложение как dpi-aware и запретить автоматическое масштабирование, задав флаг с поддержкой dpi в манифесте программы или вызвав функцию SetProcessDPIAware во время инициализации программы.
При включенной композиции DWM скрытые приложения больше не получают сообщения WM_PAINT и не запрашиваются на повторную отрисовку. Содержимое каждого окна уже доступно для создания изображения экрана.
Окна верхнего уровня WS_EX_TRANSPARENT должны сочетаться с стилем WS_EX_LAYERED для проведения тестирования попаданий. WS_EX_TRANSPARENT в классическом смысле, без перенаправления, полезно для дочерних окон в иерархии окон, принадлежащих одному потоку, но не предназначено для окон верхнего уровня.
Используйте области или слои для создания фигурных или смешанных окон. Обратите внимание, что в Windows Vista и более поздних версиях Windows пользовательское рисование только части окна верхнего уровня не обеспечит желаемое устаревшее содержимое в незарисованных областях.
API,такие как GetDCOrgEx, можно использовать для определения определенных фактических значений. Если у вас есть контекст устройства (DC) для перенаправленного окна, начало координат, возвращенное GetDCOrgEx, не будет соответствовать началу координат вашего окна на экране. В качестве начала координат теперь будет использоваться начало координат поверхности заднего буфера для вашего окна: (0, 0).
Если все остальное не удается, отключите отрисовку окна, вызвав функцию DwmSetWindowAttribute.
Практики рисования для DWM
Избегайте рисования непосредственно в основной области отображения. Это приведет к отключению композиции DWM до тех пор, пока приложение не освобождает основную поверхность устройства.
Оцените, должен ли приложение предоставлять собственную двойную буферизацию. DWM фактически дважды буферизирует содержимое и представляет окно в одном кадре.
Избегайте чтения из или записи в контекст устройства отображения. Хотя она поддерживается DWM, мы не рекомендуем ее использовать из-за снижения производительности.
Избегайте рисования в неклиентской области. Хотя к этой области можно получить доступ при помощи приложения, и рисование там поддерживается API Microsoft Win32, это может привести к потере стеклянной границы окна, если она есть.
Не используйте интерфейс графического устройства Windows (GDI) и Microsoft DirectX, если они не перекрываются. Если необходимо смешивание, либо нарисуйте содержимое GDI в программную поверхность DirectX и объедините их перед выводом на экран, либо нарисуйте их в отдельных окнах.
Используйте функцию BitBlt или StretchBlt вместо Windows GDI+ для представления рисунка для рендеринга. GDI+ отрисовывает одну строку сканирования одновременно с отрисовкой программного обеспечения. Это может привести к мерцанию в приложениях.
Клиентский регион DWM Blur-Behind
Отрисовка эффекта размытия — это ресурсоемкая операция как для ЦП, так и для графического модуля обработки (GPU). Разработчикам приложений настоятельно рекомендуется рассмотреть последствия использования размытия клиентской области, чтобы не потреблять чрезмерные ресурсы. В следующих случаях следует использовать особую осторожность:
- Если вы ожидаете, что размер размытия клиентской области будет значительным, даже если никаких обновлений не будет происходить в самой размытой области. Размытие должно отображаться, если под размытой областью окна происходят обновления, что требует затрат ресурсов CPU и GPU. Кроме того, операции с окном (перемещение, изменение размера и переходы) повлекут за собой дополнительные расходы.
- При ожидании значительных обновлений в размытой клиентской области. Для этого потребуется перерисовка размытия при каждом обновлении и это будет потреблять избыточные ресурсы.
- Если ожидается, что размытие будет охватывать значительную область, и обновления этой области также ожидаются, настоятельно рекомендуется не размывать клиентскую область.