Я намереваюсь создать небольшое приложение с 2 окнами, обычным окном с элементами управления и 3D-окном, отображаемым с помощью DirectX. Для 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;
// ...
}
Что я ожидаю от TaskManager, чтобы показать приложение занят (~ 50% использования процессора), когда 3D-окно активно и не так занято, когда нормальное окно активно (~ 5% использования процессора). Я вижу только 50% использование процессора, когда оба окна потеряли фокус, но я вижу 0-5% использования процессора, когда какой-либо из них активен. Я считаю, что должна быть разница, поэтому я не уверен, действительно ли это работает (или даже возможно). 3D-окно визуализируется, и нормальное окно также реагирует на события, но использование процессора меня смущает. Я просто не хочу, чтобы это повлияло на FPS 3D-окна.
Вместо того, чтобы пытаться определить, что происходит из диспетчера задач, почему бы просто не поставить счетчик и подсчитать, сколько раз вы используете GetMessage или PeekMessage? Затем вы можете протестировать его некоторое время и ворваться с отладчиком и проверить счетчики. –
Я сделаю это прямо сейчас. Спасибо – ali
Добавьте некоторые инструкции трассировки с OutputDebugString(), это трудно отлаживать с помощью контрольных точек. –