emscripten-core/emscripten

A version of emscripten_sleep that uses requestAnimationFrame

Open

#9 574 ouverte le 4 oct. 2019

Voir sur GitHub
 (10 commentaires) (0 réactions) (0 assignés)C++ (3 519 forks)batch import
good first bughelp wantedwontfix

Métriques du dépôt

Stars
 (27 361 stars)
Métriques de merge PR
 (Merge moyen 19j 10h) (147 PRs mergées en 30 j)

Description

With asyncify, emscripten_sleep becomes incredibly useful to implement game loops. However, the use of setTimeout means that the timing is inconsistent whereas requestAnimationFrame attempts to hold a consistent framerate.

Is there a version of this?

I am currently achieving it with this monkey patch:

const timeoutToAnimationId = {}
const originalSetTimeout = window.setTimeout;
const originalClearTimeout = window.clearTimeout;
window.setTimeout = (func, delay, ...args) => {
  if (typeof delay === 'undefined' || delay === 0) {
    const timeoutId = originalSetTimeout(() => {});
    const animationId = requestAnimationFrame(() =>
    {
      delete timeoutToAnimationId[timeoutId];
      func(...args);
    });
    timeoutToAnimationId[timeoutId] = animationId
    return timeoutId;
  } else {
    return originalSetTimeout(func, delay, ...args);
  }
}
window.clearTimeout = window.clearInterval = (timeoutId) => {
  const animationId = timeoutToAnimationId[timeoutId];
  if (typeof animationId !== 'undefined') {
    cancelAnimationFrame(animationId);
    delete timeoutToAnimationId[timeoutId];
  } else {
    return originalClearTimeout(id);
  }
}

Guide contributeur