성능 고려 사항 및 모범 사례

이 항목에서는 DWM(데스크톱 창 관리자) API를 사용하기 위한 모범 사례 집합을 제공합니다.

이 항목에는 다음과 같은 섹션이 포함되어 있습니다.

DWM에 대한 애플리케이션 사례

애플리케이션이 dpi(인치당 도트 수) 크기 조정을 처리하는 경우 프로그램 매니페스트에서 dpi 인식 플래그를 설정하거나 프로그램 초기화 중에 SetProcessDPIAware 함수를 호출하여 애플리케이션을 dpi 인식으로 선언하고 자동 크기 조정을 방지할 수 있습니다.

DWM 컴퍼지션이 켜져 있으면 가려진 애플리케이션은 더 이상 WM_PAINT 메시지를 받지 않으며 다시 렌더링하라는 메시지가 표시되지 않습니다. 각 창의 콘텐츠는 이미 화면 이미지를 작성할 수 있습니다.

최상위 WS_EX_TRANSPARENT 창은 적중 테스트를 위해 WS_EX_LAYERED 스타일과 결합되어야 합니다. 클래식 의미에서 WS_EX_TRANSPARENT 리디렉션 없이 동일한 스레드에 속하지만 최상위 창에는 적합하지 않은 창 계층 구조의 자식 창에 유용합니다.

영역 또는 계층을 사용하여 셰이핑 또는 혼합 창을 만듭니다. Windows Vista 이상 버전의 Windows에서는 최상위 창의 사용자 지정 그리기 부분만 그리지 않은 지역에서 원하는 부실 콘텐츠를 제공하지 않습니다.

GetDCOrgEx와 같은 API를 사용하여 특정 실제 값을 확인할 수 있습니다. 리디렉션된 창에 대한 디바이스 컨텍스트(DC)가 있는 경우 GetDCOrgEx 에서 반환된 원본이 화면의 창 원본과 일치하지 않습니다. 원본은 창의 백 버퍼 표면((0, 0)의 원점이 됩니다.

다른 모든 작업이 실패하면 DwmSetWindowAttribute 함수를 호출하여 창 렌더링을 사용하지 않도록 설정합니다.

DWM에 대한 그리기 사례

기본 디스플레이 화면에 직접 그리지 마세요. 이렇게 하면 애플리케이션이 기본 디바이스 화면을 해제할 때까지 DWM이 컴퍼지션을 사용하지 않도록 설정됩니다.

애플리케이션이 자체 이중 버퍼링을 제공해야 하는지 여부를 평가합니다. DWM은 콘텐츠를 효과적으로 두 배로 버퍼링하고 창을 단일 프레임에 표시합니다.

디스플레이 DC에서 읽거나 쓰는 것을 방지합니다. DWM에서 지원되지만 성능 저하로 인해 권장하지 않습니다.

클라이언트가 아닌 영역에서 그리기를 방지합니다. 이 영역은 애플리케이션에서 액세스할 수 있고 그리기는 Microsoft Win32 API에서 지원되지만 이렇게 하면 창에 있는 유리 테두리가 손실될 수 있습니다.

겹치지 않는 한 Windows GDI(그래픽 디바이스 인터페이스) 및 Microsoft DirectX를 혼합하지 마세요. 혼합이 필요한 경우 GDI 콘텐츠를 DirectX 소프트웨어 화면에 그리고 화면에 작성하기 전에 결합하거나 별도의 창에 그립니다.

렌더링을 위해 드로잉을 표시하려면 Windows GDI+ 대신 BitBlt 또는 StretchBlt 함수를 사용합니다. GDI+는 소프트웨어 렌더링을 사용하여 한 번에 하나의 스캔 라인을 렌더링합니다. 이로 인해 애플리케이션이 깜박일 수 있습니다.

DWM Blur-Behind 클라이언트 지역

흐림 효과 렌더링은 CPU와 GPU(그래픽 처리 장치) 모두에 대한 리소스를 많이 사용하는 작업입니다. 애플리케이션 개발자는 과도한 리소스를 사용하지 않도록 클라이언트 영역 흐림을 사용하는 것이 미치는 영향을 고려해야 합니다. 다음과 같은 경우 특히 주의해야 합니다.

  • 흐린 영역 자체에서 업데이트가 발생하지 않더라도 클라이언트 영역 흐림의 크기가 중요할 것으로 예상하는 경우. CPU 및 GPU 비용이 발생하는 창의 흐리게 표시된 영역에서 업데이트가 발생하는 경우 흐림 효과를 렌더링해야 합니다. 또한 창의 창 작업(이동/크기 조정/전환)에는 더 많은 비용이 발생합니다.
  • 흐린 클라이언트 영역에서 중요한 업데이트가 예상되는 경우. 이렇게 하려면 모든 업데이트에서 흐림 효과를 다시 표시하고 과도한 리소스를 사용해야 합니다.
  • 흐림이 중요한 영역을 포함할 것으로 예상되고 해당 영역에 대한 업데이트도 예상되는 경우 클라이언트 영역을 흐리게 표시하지 않는 것이 좋습니다.