emscripten-core / emscripten-core/emscripten

A version of emscripten_sleep that uses requestAnimationFrame

Open
#9,574 10 comments 0 reactions 0 assignees View on GitHub
good first bug help wanted wontfix
Dominant language
C++
Stars
27.6k
Forks
3.6k
Avg merge
1d 1h
Merged PRs (30d)
105

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:
```javascript
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);
}
}
```

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.