2011-05-14 9 views
0

알파 블렌딩을 사용하여 사용자 정의 모양의 윈도우를 그릴 수있는 스키닝 엔진을 만들고 싶습니다. 즉, 계층화 된 창 (UpdateLayeredWindow)을 사용합니다. 전형적인 윈도우는 그 배경에 10 × 10에서부터 300 × 150 픽셀에 이르는 수십 개의 다른 비트 맵을 포함합니다. 최악의 경우 이러한 요소의 대부분은 최대 30fps의 부드러운 애니메이션을가집니다. 모든 것이 알파 블렌딩 될 것이며 Direct2D를 사용할 것입니다 (예, 이전 Windows 버전에서는 지원하지 않습니다). 일반적으로 Winamp의 최신 스킨 엔진이 가장 가까운 예입니다.Windows의 스키닝 엔진 : "더티"영역 만 또는 전체 창을 한 번에 그립니다.

이 모든 것을 감안하고 최신 PC 성능을 고려하면 매 프레임마다 전체 창을 다시 그리거나 일종의 클립 사각형을 사용해야합니까?

답변

0

이 작업에 약간의 경험이 있습니다.

Windows XP를 지원해야하는 경우 UpdateLayeredWindow를 사용하면이 문제를 해결할 수있는 유일한 방법입니다. 이 호출에 대한 문서에서는 호출 될 때마다 전체 비트 맵을 화면에 복사한다고 말합니다.이 병목 현상은 벤치마킹에서 실제 한계 요소로 나타났습니다. 창 크기가 300x300 인 경우 몇 개의 픽셀 만 수정해야하는 경우에도 모든 업데이트에서 해당 가격을 지불해야합니다. 실질적인 이익을 위해 렌더링 측면을 과도하게 최적화하는 것이 매우 쉬울 것이므로 간단한 것을 구현하고, 측정하고, 최적화해야하는지 결정하십시오.

Windows XP에 대한 지원을 중단 할 수 있으면 UpdateLayeredWindow를 완전히 피하고 DwmExtendFrameIntoClientArea를 사용하여 계층화 된 윈도우와 동일한 효과를 만들 수 있습니다. 적은 코드를 작성하고 UpdateLayeredWindow 병목 현상을 피할 수 있으며 D2D가 더 쉽게 작업 할 수 있습니다.

1

D2D는 D2D를 Honneslty의 IAnimation 인터페이스를 사용 WM_PAINT 메시지와 함께 렌더링, 그냥하게 할 필요 창문 내가 당신을 알려 드릴 것입니다하지만, 윈앰프는 어도비 에어 및 layerd 창으로 이루어집니다, 다시 그리기하는 방법에 자주 걱정 d2d를 사용하면 문제가 발생합니다. (DXGI 렌더링 대상을 사용해야한다고 생각하지만, layerd중인 창에서 최종 페인트 호출로 돌아와서 알파 채널을 업데이트 할 수 있도록 DC가 필요합니다.)