我打算創建一個帶有兩個窗口的小應用程序,一個帶有控件的正常窗口和一個使用DirectX呈現的3D窗口。對於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;
// ...
}
我從任務管理預期是顯示應用在3D窗口處於活動狀態時處於忙碌狀態(〜50%的處理器使用),而在正常窗口處於活動狀態時(佔用5%的處理器)不太繁忙。當兩個窗口失去焦點時,我只看到50%的處理器使用,但是當它們中的任何一個處於活動狀態時,我看到0-5%的處理器使用。我相信應該有所不同,所以我不確定這是否真的有效(甚至可能)。 3D窗口被渲染並且正常窗口也響應事件,但是處理器使用令我困惑。我只是不希望這會影響3D窗口的FPS。
與其試圖推斷任務管理器發生的事情,爲什麼不簡單地放入計數器並計算您使用GetMessage與PeekMessage的次數?然後你可以測試一下,並用調試器打開並檢查計數器。 – 2013-04-05 15:45:35
我現在就這樣做。謝謝 – ali 2013-04-05 15:46:17
用OutputDebugString()添加一些跟蹤語句,這很難用斷點調試。 – 2013-04-05 15:50:31