我的最近游戏引擎GameMaker中遇到的一个困扰问题是在制作MOBA的时候出现了一个让人费解的BUG。如果你了解到玩家反馈移动鼠标导致游戏帧率大幅度跌下,是由这个原因造成的。

症状

快速移动鼠标而不进行点击操作,导致游戏帧率下降至几乎是 0。随鼠标停止移动,游戏即时恢复至最高速度。

谜惑

  • HTML5/GXExport:工作正常。
  • WindowsRunner:Bug。
  • 基于引擎的代码库:将游戏简化到最基本的场景,没有任何游戏对象和对象的逻辑,而仍然有明显的延迟。从而剔除了原码和鼠标位置的延迟或影响。

原来原因:原始设备交互获取

我的新鼠标的采样率为 8000Hz。这意味着每秒有8000个原始设备交互事件。

  1. 引擎:使用Win32中的注册原始设备(RegisterRawInputDevices)进行输入。
  2. 瓶颈: 在8000Hz采样量下,会对游戏循环进行同步处理,导致游戏循环无从接触。
  3. 工作原理:HTML5在浏览器环境下自动进行事件抖动(throttle)处理,限制到动画帧速率(一般约为60Hz,非本机鼠标设备)。

最终解决方案

降低采样率至 2000Hz 或下降至 2000 Hz 可以立即解决这个问题。但是作为开发者来说不能要求每个玩家降低他们的硬件设置。

  • 技术-fix: 在GMStudio中暂无直接的解决方案。

与其它问题相关的信息:

因为像Razer、Lamzu和Pulsar这样的鼠标品牌率先采用4k和8k采样率,这会导致这一个问题影响玩家中日渐高涨。如果你的游戏某些玩家体验出现卡顿或者抖动的情况,那么去检查他们的鼠标设置。