cai*_*mcg 6 c++ windows winapi visual-c++
这是我第一次使用 Windows 应用程序,我有点沮丧。我只有一个简单的代码来创建一个 Win32(Visual C++) GUI 应用程序,但是一旦我启动可执行文件,我的 CPU 就会上升到 30%(在应用程序上),在我寻找解决这个问题的过程中,我发现有人说在消息循环(GetMessage 或 PeekMessage)中睡眠 10 毫秒可以解决这个问题,而且确实如此。但由于我真的不喜欢突然休眠我的代码,而且事实上这是一个事件处理程序循环,我希望得到有关如何解决此问题的解释。
一瞥“麻烦地区”。
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!
}
Run Code Online (Sandbox Code Playgroud)
提前致谢
卡约·盖德斯
标准 Windows 应用程序循环使用 GetMessage。GetMessage 会阻塞,直到应用程序中有输入或需要运行的内容为止。
MSG msg;
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
Run Code Online (Sandbox Code Playgroud)
当您希望 DirectX 尽可能快地渲染帧,同时仍为其他进程内窗口和 Win32 API 发送消息时,您所编写的代码对于游戏来说是合适的和标准的。当您以这种方式编码时,您所编码的内容本质上是使用整个 CPU 核心。(如果您有四核 CPU,则至少使用 25%,因此 30% 的测量似乎是准确的)。
周期Sleep(0)orSleep(1)语句对于允许主线程屈服于其他线程和进程很有用。您将牺牲一点帧速率,但有时如果游戏有其他线程用于网络和声音,这是必要的。但由于您有一个多核 CPU,那么您可能不需要这样做,因为其他核心可以为这些线程提供服务。
在过去,在超线程和多核出现之前,执行Sleep语句是避免完全占用资源的正常方法。它允许 Windows 上的其他后台应用程序能够运行。
| 归档时间: |
|
| 查看次数: |
3125 次 |
| 最近记录: |