저는 DirectX로 렌더링 된 컨트롤과 3D 윈도우가있는 일반 창인 2 개의 창으로 작은 애플리케이션을 만들 계획입니다. 3D 윈도우의 경우 PeekMessage()
은 메시지를 확인한 후에 대기하지 않으므로 일반 윈도우 (3D 렌더링 없음)의 경우 GetMessage()
기능을 사용하여 프로세서가 과용하지 않는 것을 방지합니다. 그럼, 3D 창이 활성화되었을 때 (WM_ACTIVE
메시지 수신) PeekMessage()
을 사용하고 일반 창이 활성화되었을 때 GetMessage()
을 사용하고 싶습니다.GetMessage와 PeekMessage를 결합하십시오.
메인 루프는 다음과 같이 보일 것이다 :
NormalWindowActive = false;
Window3DActive = false;
MSG msg;
while (TRUE) {
if (PeekMessage(&msg, NULL, 0U, 0U, PM_REMOVE)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
if (NormalWindowActive) {
if (GetMessage(&msg, NULL, 0, 0)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
} else {
RenderWindow();
}
}
이러한 윈도우의 메시지 처리기에서 나는 WM_ACTIVATE
메시지가 :
HWND NormalWindow, Window3D; // These windows are global vars
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) {
// ...
case WM_ACTIVATE:
if (wParam!= WA_INACTIVE) {
if (hWnd == NormalWindow) {
NormalWindowActive = true;
Window3DActive = false;
} else {
Window3DActive = true;
NormalWindowActive = false;
}
}
break;
// ...
}
내가이 윈도우 작업 관리자에서 기대하는 응용 프로그램을 표시하는 것입니다 보통 창 (~ 5 % 프로세서 사용)이 활성화되어있을 때 3D 창이 활성 상태 일 때 바쁜 (~ 50 % 프로세서 사용). 두 창 모두 포커스를 잃었을 때만 50 % 프로세서 사용을 볼 수 있지만 그 중 하나가 활성화되어있을 때 0-5 % 프로세서 사용이 표시됩니다. 차이가 있어야한다고 믿습니다. 그래서 이것이 실제로 작동하는지 (또는 가능한지) 확실하지 않습니다. 3D 윈도우가 렌더링되고 일반 윈도우도 이벤트에 응답하지만 프로세서가 나를 혼란스럽게합니다. 나는 이것이 단지 3D 윈도우의 FPS에 영향을 미치기를 원하지 않는다.
작업 관리자에서 무슨 일이 일어나고 있는지 추론하는 대신 카운터에 넣고 GetMessage와 PeekMessage를 몇 번 사용했는지 계산하지 않으시겠습니까? 그런 다음 잠시 테스트하고 디버거를 사용하여 카운터를 검사 할 수 있습니다. –
지금 당장하겠습니다. Thanks – ali
OutputDebugString()을 사용하여 추적 문을 추가하면 중단 점을 사용하여 디버그하기가 어렵습니다. –