2012-03-11 1 views
1

WS_EX_LAYERED 스타일 창을 사용하여 경계선없는 창을 만들려고합니다. 목표는 DirectX를 사용하여 바탕 화면에 직접 그래픽을 렌더링하고 알파를 사용하여 현재 데스크톱 창에 블렌드하는 것입니다.스킨 된 창 : Win32 API 및 DirectX

내 시스템에서이 기술은 완벽하게 작동하는 것 같습니다. 다양한 알파 레벨을 설정하고 다양한 수준의 투명성을 얻을 수 있습니다. 불행히도 여러 사용자가 심각한 성능 문제와 낮은 프레임 속도를보고하여이 기술을 사용할 수 없게 만들었습니다. 다음과 같이

코드 설정은 다음과 같습니다

  1. 는 계층화 된 (WS_EX_LAYERED 확장 스타일) 창을 만듭니다.
  2. HWND 창을 사용하여 DirectX를 초기화하십시오.
  3. CreateRenderTarget DirectX 메서드를 사용하여 렌더링 대상을 만듭니다.

그런 다음 렌더링 루프시 :

  1. 의 DirectX 호출을 사용하여 렌더 타겟에 그래픽을 렌더링합니다.
  2. GetDC 메서드를 사용하여 DirectX 렌더링 대상 표면에 대한 HDC 핸들을 가져옵니다.
  3. DirectX 표면 HDC를 지정하여 UpdateLayeredWindow 함수를 사용하여 창 내용을 업데이트하십시오.

내 질문은 : 내가 잘못하고있는 것입니까? 창 업데이트의 성능을 향상시킬 수있는 방법이 있습니까? 렌더링 대상을 잠그고 수동으로 DIB 섹션에 비트를 복사하여 성공하지 않고 창 영역에 표시하는 등의 다양한 작업을 시도했습니다.

답변

0

창 크기는 얼마나됩니까? 참고 http://msdn.microsoft.com/en-us/library/windows/desktop/ms633556%28v=vs.85%29.aspx의 MSDN 설명서에 "계층화 된 창과 모든 기본 창에 대한 최상의 그리기 성능을 위해 계층화 된 창은 가능한 작아야합니다."

합성 (Aero)을 사용하는 경우 성능이 향상 될 수 있습니다. Windows가 이미 합성 중이면 계층화 된 윈도우를 그릴 때 많은 작업을 수행 할 필요가 없습니다.

합성에 따라 성능에 차이가없는 경우 여기를 완전히 벗어 났을 것입니다.

+0

기본적으로 Aero는 사용하지 않도록 설정되어 있지만 사용하도록 설정했기 때문에 성능이 변경되지 않았습니다. –