我正在使用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