我正在使用DirectX和WINAPI处理家庭项目。我刚刚发现了一个有趣的行为。了解Windows API中消息处理的不同策略
在下面的代码,如果我用我的wndd->h_
(类型:HWND),究竟是什么的CreateWindowEx()
结果,在PeekMessage()
作为第二个参数,然后在主循环开始在单个核心的工作更重的负载,而将第二个参数保留为0,然后计算扩展良好。
void WinLoop() {
while (!wndd->exit_) {
//if (PeekMessage(&(wndd->msg_), 0, 0, 0, PM_REMOVE)) { //NOTE : Frequently changing what core is loaded
if (PeekMessage(&(wndd->msg_), wndd->h_, 0, 0, PM_REMOVE)) { //NOTE : Heavy load on one core
TranslateMessage(&(wndd->msg_));
DispatchMessage(&(wndd->msg_));
}
//TODO : update
//TODO : draw
//TODO : calculate statistic
}
}
一切似乎工作得很好,但我无法找到任何有关此信息。引擎盖下是什么?
非常感谢!我只是在一秒钟内测量这样的CPU中可以烧掉多少次迭代。有趣的是PeekMessage()条件,所有的窗口消息都旋转得更快o.O我在这里错过了什么? – NMD
我不明白,这个答案如何解决这个问题。在典型的DirectX应用程序中,通常只有一个窗口,唯一的公共线程消息是“WM_QUIT”。在这些前提下,过滤这个单独窗口的消息不会占用*“少得多的消息”*。即使是这样,它也没有解释为什么不过滤消息会在所有内核之间传播CPU负载。 – IInspectable
我想如果你设置PeekMessage到一个特定的窗口,它可以在“一个”线程中完成。我是这里的小伙子,我只是猜测......如果你有很多窗口,那么低级别的东西会尝试用多个线程来管理它。但是......问题是:当PeekMessage必须处理“更少”的消息时,为什么地狱循环会变慢o.O – NMD