我试图找出在Windows的OpenGL游戏中使用用户输入的最佳方法。我有四种选择:
(1)只需查看主消息循环中游戏窗口的消息,其中也包含渲染,如下所示:
while (running) {
while (PeekMessage(&msg, hWnd, 0, 0, PM_REMOVE)) {
DispatchMessage(&msg);
}
render();
SwapBuffers(hDC);
}
//...
LRESULT CALLBACK windowProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) {
//do something with messages
}
这是大多数OpenGL教程中使用的方法。这种方法的一个大问题是FPS依赖。
(2)在WH_KEYBOARD_LL / WH_MOUSE_LL的单独线程中使用 SetWindowsHookEx :
HHOOK hhK = SetWindowsHookEx(WH_KEYBOARD_LL,
[](int nCode, WPARAM wParam, LPARAM lParam)->LRESULT {
KBDLLHOOKSTRUCT *pkbhs = (KBDLLHOOKSTRUCT *) lParam;
//handle keyboard
return CallNextHookEx(0, nCode, wParam, lParam);
}
, GetModuleHandle(NULL), NULL);
HHOOK hhM = SetWindowsHookEx(WH_MOUSE_LL,
[](int nCode, WPARAM wParam, LPARAM lParam)->LRESULT {
MSLLHOOKSTRUCT *pkbhs = (MSLLHOOKSTRUCT *) lParam;
//handle mouse
return CallNextHookEx(0, nCode, wParam, lParam);
}
, GetModuleHandle(NULL), NULL);
//We don't event have to create a window
MSG msg;
while (GetMessage(&msg, NULL, 0, 0)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
这种方法允许我每秒查看任意数量的消息,但这对我来说似乎过于模糊+它将整个用户输入挂钩到系统中,这对我来说似乎也不对。
(3)与(2)相同,但使用WH_KEYBOARD / WH_MOUSE。需要一个单独的.dll,这似乎是一个开销。
(4)使用 DirectInput 。没试过,但是从我在文档和教程中看到的,可能是最好的方式+我们可以轻松地从游戏手柄捕获输入。
问题是我正在尝试构建OpenGL游戏,而DirectInput是DirectX的一部分。
所以,我的问题是 - 哪种方式是使用用户输入的正确方法?或者也许我错过了哪些方法?