我正在制作一个基于UI的DirectX 11应用程序。我一直没有问题,直到我发现PeekMessage()
使用高CPU使用率(当窗口最小化时,它的使用率是原来的三倍),所以我决定使用GetMessage()
,但现在输入变得很奇怪,我不知道如何解释,当鼠标停止时,它不会给予我光标的位置。
下面是提供光标位置的函数:
Vector2f* InputSystem::GetMousePosition(Window* window, bool normalized) {
POINT p;
GetCursorPos(&p);
RECT r;
GetClientRect(window->hWnd, &r);
ScreenToClient(window->hWnd, &p);
lastMousePos = Vector2i(p.x - (r.right - r.left) / 2.0f, p.y - (r.bottom - r.top) / 2.0f);
lastMousePos.y *= -1.0f;
lastMousePos *= 2.0f;
if (normalized) { lastMousePos /= Vector2f(window->GetClientSize().x, window->GetClientSize().y); }
return &lastMousePos;
}
和循环:
while (mainWindow.IsRunning()) {
mainWindow.Broadcast();
mainWindow.PhaseUpdate();
mainWindow.Loop();
}
Window::Broadcast()
:
void Window::Broadcast() {
if (GetMessageA(&msg, hWnd, NULL, NULL)) {
TranslateMessage(&msg);
DispatchMessageA(&msg);
}
}
1条答案
按热度按时间uqzxnwby1#
GetMessage()
会阻塞调用线程直到消息到达。PeekMessage()
不会阻塞。您希望在游戏循环中使用类似PeekMessage()
的代码而不是GetMessage()
。尽管您声明了这一点,但使用PeekMessage()
不会增加CPU负载,除非您误用它。例如,与其在每个循环迭代中只调用一次,尝试在第二个循环中调用它,直到消息队列被清空,例如:另请参阅The dangers of filtering window messages