CPU使用率高的Win32应用程序
Win32 Application with high CPU usage
这是我第一次使用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(),它是一个阻塞函数。它会阻塞,直到有东西要处理。
相关文章:
- WM_CTLCOLORSTATIC从未在WIN32应用程序中触发
- 如何从 Win32 C++ 应用程序输出到父控制台窗口?
- SWIG和Mingw-64与Python一起使用...不是有效的 Win32 应用程序
- 在 Win32 应用程序中承载 GTK+3 上下文
- 开发如何解决错误193:%1不是Dev C 中的Win32应用程序
- 您如何使用Winrt创建经典的Win32应用程序窗口
- 链接错误时,使用CLION/CMAKE/MSVC 2015编译WIN32应用程序
- 如何在VS 2017 C++Win32应用程序中打印出gethostname结果
- 我如何将Win32应用程序迁移到X64
- 如何制作一个不依赖msvc dll的win32应用程序
- 空的Win32 C++应用程序内存消耗过多
- 是否可以在 Visual Studio 中的 Win32 C++应用程序中的控制台中进行调试
- 从头开始创建C 背景Win32应用程序
- 托管C#Win32应用程序的非托管DLL.与课堂入口
- Exe不是有效的win32应用程序,但在64位上运行
- 具有控制台输出且没有新窗口的 Win32 应用程序
- 使用 C++11 编写 Win32 应用程序
- 使用类设置 win32 应用程序的更好方法
- 用于 Win32 应用程序的 WriteFile() 函数
- 调用 C 代码的 Win32 应用程序