Какова оптимальная частота опроса геймпада?

Я опрашиваю Gamepad в JS, используя таймер 250 мс для переключения между 4 различными точками зрения. Однако это значение все еще слишком велико, чтобы гарантировать просмотр каждого нажатия кнопки. Я заметил, что если кнопка нажата и отпущена слишком быстро (т. Е. < 250 мс), то она пропускается.

Я не вижу никаких триггеров событий, связанных с геймпадом, кроме подключенного и отключенного контроллера, и я застрял в опросе и увеличении частоты.

Кто-нибудь может предложить способ гарантированного обнаружения нажатия кнопки, без увеличения частоты опроса? Если увеличение частоты опроса является единственным вариантом, что будет считаться оптимальным?

2 ответа

Вы должны опрашивать с частотой не менее 60 Гц, чтобы обеспечить захват нового состояния кнопки / оси хотя бы один раз для каждого кадра анимации. Большинство приложений опрашивают в цикле requestAnimationFrame, но это не всегда лучшее решение, потому что вы все равно можете пропустить нажатия кнопок.

Оптимальная частота опроса определяется внутренним поведением браузера. Например, в Chrome браузер загружает новое состояние геймпада только каждые 16 миллисекунд (62,5 Гц), поэтому, если вы выполните опрос с частотой ~100 Гц, вы обязательно увидите каждое обновление. Все еще можно пропустить нажатия кнопок, если они происходят между итерациями опроса, но с этим ничего не поделаешь. (Почти ничего: сборки Chrome Dev и Canary имеют опцию chrome://flags#gamepad-polling-rate, которую вы можете использовать для проверки различных внутренних скоростей опроса.)

Частота внутреннего опроса не определяется спецификацией, не отображается непосредственно на странице и может быть изменена. Например, браузер может выбрать объединение обновлений ввода геймпада и согласовать их с циклом requestAnimationFrame, что сведет на нет любые преимущества более частого опроса. Будьте осторожны, полагаясь на поведение, зависящее от реализации, и проверьте свои предположения.

В Firefox вы можете включить нестандартные события кнопок и осей, которые могут позволить вам обнаруживать, когда обновления ввода происходят вне вашего обычного цикла опроса. AFAIK эти события реализованы только на FF и по умолчанию отключены, но могут быть полезны для тестирования.

API-интерфейс Gamepad действительно поддерживает только опросы, и ваша частота опроса действительно слишком низкая.

Предполагая, что вы пытаетесь создать игру, отзывчивость геймпада в идеале должна быть такой же высокой, как и частота кадров игры. Это будет гарантировать, что нажатие кнопки всегда будет поймано.

в 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));
}
Другие вопросы по тегам