CPU使用率高的Win32应用程序

Win32 Application with high CPU usage

本文关键字:Win32 应用程序 使用率 CPU      更新时间:2023-10-16

这是我第一次使用Windows应用程序,我有点沮丧。我只有一个简单的代码来创建Win32(Visual C++)GUI应用程序,但一旦我启动可执行文件,我的CPU就会上升到30%(超过应用程序),在我寻找解决这个问题的方法时,我发现有人说在消息循环(GetMessage或PeekMessage)中睡眠10ms可以解决这个问题,事实确实如此。但是,由于我并不喜欢突然睡代码,而且这是一个事件处理程序循环,我希望能解释一下如何解决这个问题。

窥探"麻烦区域"。

while (TRUE) {
    if (PeekMessage(&g_Msg, NULL, 0, 0, PM_REMOVE)) {
        TranslateMessage(&g_Msg); // translate keystroke messages into the right format
        DispatchMessage(&g_Msg); //Send the message to the WindowProc function
        if (g_Msg.message == WM_QUIT)
            break;
    } else {
        // Run d3d code here
    }
    // Sleep(1); REDUCES CPU!
}

提前感谢

Caio Guedes

标准的Windows应用程序循环使用GetMessage。GetMessage会阻塞,直到应用程序中有需要运行的输入或其他内容。

MSG msg;
while (GetMessage(&msg, NULL, 0, 0))
{
    TranslateMessage(&msg);
    DispatchMessage(&msg);
}

当您希望DirectX尽可能快地渲染帧,同时仍为其他进程内窗口和Win32 API发送消息时,您所编码的内容适用于游戏。当你以这种方式进行编码时,你所编码的基本上是使用整个CPU核心。(如果你有一个四核CPU,你至少使用了25%,所以30%的测量似乎是准确的)。

周期性的Sleep(0)Sleep(1)语句可用于允许主线程向其他线程和进程让步。你会牺牲一点帧速率,但有时如果游戏有其他网络和声音线程,这是必要的。但是,由于您有一个多核CPU,那么您可能不需要这样做,因为其他核心可以为这些线程提供服务。

在过去,在超线程和多核之前,执行Sleep语句是不占用全部资源的正常方式。它允许Windows上的其他后台应用程序能够运行。

您应该使用GetMessage(),它是一个阻塞函数。它会阻塞,直到有东西要处理。