4

我打算创建一个带有 2 个窗口的小应用程序,一个带有控件的普通窗口和一个 3D 窗口,用 DirectX 渲染。推荐用于 3D 窗口PeekMessage(),因为它在检查消息后不会等待,但对于普通窗口(无 3D 渲染),该GetMessage()函数用于避免处理器无意义的过度使用。因此,当 3D 窗口处于活动状态(WM_ACTIVE收到消息)时,我想使用PeekMessage(),而当普通窗口处于活动状态时,我想使用GetMessage()

主循环如下所示:

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 的期望是在 3D 窗口处于活动状态时显示应用程序繁忙(大约 50% 的处理器使用),而在正常窗口处于活动状态时显示应用程序繁忙(大约 5% 的处理器使用)。当两个窗口都失去焦点时,我只看到 50% 的处理器使用率,但当它们中的任何一个处于活动状态时,我看到 0-5% 的处理器使用率。我相信应该有区别,所以我不确定这是否真的有效(甚至可能)。3D 窗口被渲染,普通窗口也响应事件,但处理器的使用让我感到困惑。我只是不希望这影响 3D 窗口的 F​​PS。

4

1 回答 1

0

您应该检查 3D 窗口是否处于非活动状态,而不是检查普通窗口是否处于活动状态。您也可以使用WaitMessage代替,GetMessage因为它可以避免重复代码。

例如:

if (Window3DActive)
    RenderWindow();
else
    WaitMessage();

您的问题似乎是当普通窗口处于非活动状态时,即使 3D 窗口处于非活动状态,消息循环也不会等待。

如果您决定使用WaitMessage,您还应该循环,PeekMessage因为队列中可能有不止一条消息,并且WaitMessage在有新消息到达之前不会返回。

于 2014-08-27T02:28:29.653 回答