C++ 在游戏中捕捉用户输入的最佳方式
我试图找出在OpenGL Windows游戏中使用用户输入的最佳方法。我有四个选择: (1)只需在主消息循环中查看游戏窗口的消息,其中还包含渲染,如下所示:C++ 在游戏中捕捉用户输入的最佳方式,c++,winapi,opengl,input,directinput,C++,Winapi,Opengl,Input,Directinput,我试图找出在OpenGL Windows游戏中使用用户输入的最佳方法。我有四个选择: (1)只需在主消息循环中查看游戏窗口的消息,其中还包含渲染,如下所示: while (running) { while (PeekMessage(&msg, hWnd, 0, 0, PM_REMOVE)) { DispatchMessage(&msg); } render(); SwapBuffers(hDC); } //... LRESULT
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)在一个单独的线程中使用SetWindowsHookEx,使用WH\u键盘LL/WH\u鼠标LL:
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)相同,但使用WHU键盘/WHU鼠标。需要单独的.dll,这似乎是一种开销
(4)使用DirectInput。我没有尝试过,但从我在文档和教程中看到的,这可能是最好的方法+我们也可以轻松地从gamepad捕获输入
问题是我正在尝试构建OpenGL游戏,而DirectInput是DirectX的一部分
所以,我的问题是-哪种方式是处理用户输入的正确方式?或者我错过了一些方法?他们谈论的是我不想使用的跨平台库,并告诉我“你必须去操作系统API收集输入”——这正是我想要做的……首先决定你在做什么类型的游戏。格斗游戏可能会以高于刷新显示的固定频率轮询输入,但在其他类型的游戏中,您可以将输入作为事件循环/消息泵中的一系列事件进行处理,并且只处理每帧开始时对输入的更改。@AndonM.Coleman基本上,我需要一个完全独立于FPS的输入。然后,您需要从输入事件处理程序中提取一个单独的线程,或者在单独的线程中轮询您的输入。但是,如果允许绘图导致输入采样率的变化(例如,
SwapBuffers(…)
导致无法预测的时间阻塞),则无法实现该特性。在单个线程中,使用事件方法以及可变帧率不会错过任何输入事件,但您也不知道事件发生的确切时间。