首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >最优的游戏手柄轮询频率是多少?

最优的游戏手柄轮询频率是多少?
EN

Stack Overflow用户
提问于 2018-07-23 12:20:33
回答 2查看 1.5K关注 0票数 4

我正在使用250ms的计时器在js中轮询Gamepad,以在4个不同的视点之间切换。然而,这个值仍然太高,不能保证每次按下按钮时都能看到。我注意到,如果按钮被按下并释放得太快(即< 250ms),那么它就会被遗漏。

除了控制器连接和断开之外,我看不到任何与gamepad相关的事件触发器,我被轮询和增加频率所困。

有没有人能提出一种方法,保证在不增加轮询频率的情况下检测到按钮按下?如果增加轮询频率是唯一的选择,那么什么才是最优的呢?

EN

回答 2

Stack Overflow用户

发布于 2018-07-24 00:34:39

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

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

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

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

票数 2
EN

Stack Overflow用户

发布于 2018-07-23 14:05:52

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

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

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

如果你看一看neogeek's gamepad.js,你会看到它在每一帧都使用API来轮询游戏手柄:

代码语言:javascript
运行
复制
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));
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51471529

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档