我正在为 Android/OUYA 和 PC 在 Java 上创建一个多平台(但支持 OpenGL)游戏引擎,并且在快速检查游戏手柄状态时,PC 平台适配器给了我一些问题。
我目前正在使用 LWJGL/JInput 编写 PC 适配器,并且每当我以超过每秒 30 次的速度轮询游戏手柄状态时(大约 33 毫秒进行轮询和更新状态),从游戏手柄获得的值都是错误的。假的意思是摇杆可以在右边的一半,但 getAxisValue 返回 0 而不是 1f 中接近 0.5f 的东西。最重要的是,它似乎需要比 33ms 更长的时间,否则当被要求更频繁地执行此操作时会很好。是什么赋予了?
简而言之,在典型的更新调用中发生的情况是,引擎会扫描活跃玩家的控制器,以了解游戏中实际使用的特定按钮的状态,所有这些都提前设置和注册。目前,在我的测试应用程序中,它由两个按钮和一个轴组成。所以它所做的只是检查三个输入的当前状态,仅此而已。在通过几层接口并进入一个开关块之后,最终这被称为:
return controller.isButtonPressed(map.A);
或者
return controller.getAxisValue(map.LS_H);
其中 map 包含将名称链接到给定控制器的特定索引值的最终整数。
我通过自己的测试发现:
- 这不是硬件问题,因为它在低于每秒 30 到 35 次更新时保持相当准确。
- 当将速度提高到每秒更新约 60 次以匹配图形线程的 60fps 速率时,它只会导致输入线程的大量延迟。图形线程不受影响,这让我认为这也不是一般的性能问题。
- 将 isButtonPressed 或 getAxisValue 更改为任意预设值可解决更新滞后问题,因此不是我的代码导致间歇性停止,绝对是 isButtonPressed 和 getAxisValue。
有什么方法可以提高游戏手柄检查的速度,或者我错过的某个设置通过 LWJGL/JInput 禁用了不必要的输入例程?
在性能方面要求匹配 60fps 是否太多?