2014-01-25 2 views
0

WM_PAINT 메시지를 처리 ​​할 때 BeginPaint 및 EndPaint 호출을 생략하고 CPU 사용률을 최대 100 %까지 쐈습니다. 왜 이런거야?WinAPI : WM_PAINT의 BeginPaint 및 EndPaint를 생략하면 CPU 사용률이 100 %가됩니다.

나는 또한 작업자 스레드를 사용하고 있지만 다른 작업을 수행하고이 문제에 영향을 미치지 않는 것으로 보입니다.

또한 BeginPaint 대신 GetDC()의 장치 컨텍스트를 사용할 수 있습니까? 그들은 다른 값을 가진 것처럼 보이므로 나는 그들이 다른 직업을 가지고 있다고 생각했습니다. 내가 바보 같은 소리 경우

죄송합니다 - 나는

감사

... WinAPI를, C++ 및 일반적인 논리의 단지 세계에 새로 온 사람
+0

다음의 tjis에 더 읽을 수있는 경우에 도움이 될 것입니다 경우

확실하지, 당신은 전혀 WinAPI를를 사용하는 특별한 이유가있다 ? 요즘 직접 사용하는 이유는 거의 없습니다. 기존 프로그램을 유지하는 것 이외에는 요. – Cubic

+1

Begin/Endpaint는 WM_PAINT 메시지가 실제로 처리되었음을 OS에 알리는 데 사용됩니다. 그래서 그 호출을 사용하지 않으면 OS는 뭔가를 그려야한다는 것을 앱에 알려줍니다. –

+0

GetDC()에 의해 반환 된 DC는 제한이 없으며 클리핑 경계가 없습니다. BeginPaint에서 반환 한 DC는 업데이트가 필요한 창의 일부를 나타내는 DC를 반환합니다. 이 지역 밖에 페인트 칠을하면 잘립니다. 내 관찰에서 GetDC()에 의해 반환 된 DC의 GDI 작업은 BeginPaint에 의해 반환 된 DC의 동일한 코드보다 더 우수한 성능을 제공합니다. 특히 코드가 각 WM_PAINT의 전체 창을 다시 그리는 경우 특히 그렇습니다.WM_PAINT에서 GetDC가 반환 한 DC를 사용할 수 있지만 BeginPaint/EndPaint를 호출하여 영역이 업데이트되었음을 ​​나타내야합니다. – selbie

답변

8

이것은 전적으로 정상입니다. 창 업데이트 영역이 비어 있지 않으면 Windows에서 WM_PAINT 메시지를 생성합니다. 당신이 무엇입니까 할 수 가정 다시 비어 있습니다. 예를 들어 Begin/EndPaint()를 호출하면됩니다.

그렇지 않은 경우 Windows 즉시은 아직 또 다른 WM_PAINT 메시지를 생성하지만 여전히 업데이트 영역을 비우기 위해 시도합니다. 스레드는 100 % 코어를 소모하여 WM_PAINT 메시지를 처리하고 실제로 작업을 완료하지 않습니다. 어쩌면 당신은 실제로 그림을 그리는 것일뿐입니다. Windows는 당신이 그린 그림을 모르고 그 그림을 추측하려고하지 않습니다.

Begin/EndPaint()를 사용하면 해당 작업을 정상적으로 수행 할 수 있습니다. 유일한 방법은 아니며 ValidateRect() 또는 ValidateRgn()을 호출 할 수도 있습니다. 당신이 "winapi에 새로운"한, 나는 당신이 이것을 정상적인 방법으로하도록 강력히 권합니다.

+0

내가 보았지만, 평소 GDI 방식 대신 OpenGL을 사용해도 될까요? BeginPaint()/EndPaint() 사이에 glWhatEver 함수를 호출해야합니까? (OpenGL에서 기초가 있으므로 C++로 이식하는 것이 적어도 어느 정도 가능합니다) –

+0

OpenGL 튜토리얼이 많이 있습니다. –

1

GDI는의 일부를 업데이트 할 수있는 WM_PAINT 메시지를 발행합니다 창. BeginPaint/EndPaint()은 핸들러에서 해당 작업을 수행하고 있음을 gdi에 알립니다. 지정된 영역에 대해 BeginPaint()가 없으면 WM_PAINT 메시지가 생성됩니다. WM_PAINT 처리기에 BeginPaint/EndPaint()이 필요하고 CPU 사용률이 높은 부분이없는 이유입니다.

GetDC()는 앞 단락에서 언급 한 이유 때문에 Begin + EndPaint() 대신 사용할 수 없습니다.

3

확실하지 않은 경우 beginpaint와 endpaint도 그려진 영역의 유효성을 검사합니다. 사용하지 않으면 윈도우는이 영역을 다시 그리는 것을 인식하지 못합니다. ValidateRect 함수를 호출하여 사실을 알릴 수 있습니다 그 창은 다시 그려졌다. 이것은 당신이 C++에 새로해서, 당신은 너무

Difference between GetDC() and BeginPaint()

관련 문제