【问题标题】:What is the optimum gamepad polling frequency?最佳游戏手柄轮询频率是多少?
【发布时间】:2018-07-24 01:26:54
【问题描述】:

我正在使用 250 毫秒计时器在 js 中轮询 Gamepad,以在 4 个不同的视点之间切换。然而,这个值仍然太高,无法保证看到每个按钮按下。我注意到如果一个按钮被按下和释放太快(即,

除了控制器连接和断开之外,我看不到任何与游戏手柄相关的事件触发器,并且我被轮询和增加频率卡住了。

任何人都可以提出一种方法来保证检测到按钮按下,而不增加轮询频率吗?如果增加轮询频率是唯一的选择,那么什么是最佳选择?

【问题讨论】:

  • 可能想尝试在Game Development SE 询问此问题
  • @mhodges Stack Overflow 是这个问题完全可以接受的地方。
  • @Brad “最佳轮询频率是多少?”对我来说似乎很固执,并且与游戏开发有关。我没有看到 MCVE。我想这只是一个写得不好的问题。标题和最后两句话似乎朝着不同的方向发展。一个是询问轮询频率,另一个是询问游戏手柄事件检测。
  • @mhodges 如果您阅读问题并解释实际询问的内容,而不是查看标题并按字面意思理解,您会发现问题本质上是,“我怎样才能可靠地检测到按下游戏手柄按钮?”问题是关于正确使用 Web API,而不是特定于游戏。虽然我当然不会在更具体的网站上劝阻这个问题,但这一点也不离题。

标签: javascript gamepad-api


【解决方案1】:

您应该以(至少)60 Hz 的频率进行轮询,以确保每个动画帧至少捕获一次新的按钮/轴状态。大多数应用程序在 requestAnimationFrame 循环中进行轮询,但这并不总是最好的解决方案,因为您仍然可能会错过按钮按下。

最佳轮询率由浏览器的内部行为决定。例如,在 Chrome 中,浏览器仅每 16 毫秒(62.5 Hz)获取新的游戏手柄状态,因此如果您以 ~100 Hz 的频率进行轮询,那么您一定会看到每次更新。如果在轮询迭代之间发生按钮按下,仍然可能会错过按钮按下,但您对此无能为力。 (几乎什么都没有:Chrome Dev 和 Canary 版本有一个 chrome://flags#gamepad-polling-rate 选项,您可以使用它来测试不同的内部轮询率。)

内部轮询率未由规范定义,不直接暴露于页面,并且可能会发生变化。例如,浏览器可以选择合并游戏手柄输入更新并将它们与 requestAnimationFrame 循环对齐,这将抵消更频繁轮询带来的任何好处。在依赖特定于实现的行为并测试您的假设时要小心。

在 Firefox 上,您可以启用非标准按钮和轴事件,这可以让您检测何时在正常轮询循环之外发生输入更新。 AFAIK 这些事件仅在 FF 上实现,默认情况下被禁用,但可能对测试有用。

【讨论】:

    【解决方案2】:

    Gamepad API确实只支持轮询,你的轮询频率确实太低了。

    假设您正在尝试构建游戏,理想情况下,游戏手柄的响应速度应与游戏的帧速率一样高。这将确保始终捕捉到按钮按下。

    Javascript 的requestAnimationFrame 就是为此目的而设计的。

    如果您查看neogeek's gamepad.js,您会发现它使用 API 在每一帧轮询游戏手柄:

    Gamepad.prototype._loop = function () {
    
        ...
    
        self._events.gamepad.forEach(function (gamepad, player) {    
            if (gamepad) { 
                Object.keys(gamepad).forEach(function (key) {   
                    self._handleEvent(key, gamepad, player);   
                });    
            }    
        });
    
        ...
    
        self._requestAnimation = _requestAnimationFrame(self._loop.bind(self));
    }
    

    【讨论】:

    • 即使在每一帧轮询也并不总是足够的。这取决于您的应用程序以及输入延迟等事情对您的重要性。例如,在绘制到屏幕上的每一帧中多次处理输入可能是有意义的。在快节奏的游戏中,这将使您能够检测到持续时间少于帧之间间隔的非常快速的按钮按下。
    • @nondebug 首先,你是对的。在每一帧轮询不是一个绝对的解决方案。但是,您可以争辩说这样的解决方案不存在。在我看来,假设一个不错的 30 fps,一个按钮在一帧中被按下两次的可能性很小。我想这归结为对检测的重要性以及帧速率有多高的估计。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-26
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    • 2012-08-20
    • 1970-01-01
    相关资源
    最近更新 更多