Поделиться через


Рекомендации и аспекты производительности

В этом разделе представлен набор рекомендаций по использованию 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. Кроме того, операции с окном (перемещение, изменение размера и переходы) повлекут за собой дополнительные расходы.
  • При ожидании значительных обновлений в размытой клиентской области. Для этого потребуется перерисовка размытия при каждом обновлении и это будет потреблять избыточные ресурсы.
  • Если ожидается, что размытие будет охватывать значительную область, и обновления этой области также ожидаются, настоятельно рекомендуется не размывать клиентскую область.