js: Substantially simplify timer code

The C code in the Emscripten front-end already keeps a timer_active
variable to ensure that the timer can be activated only when it's
inactive, and deactivated only when it's active.  Adjusting the
JavaScript side to rely on this makes the code much simpler.  The only
oddity is that it now requests a new animation frame before calling the
callback so that it's ready to be cancelled if the callback decides to
deactivate the timer.
This commit is contained in:
Ben Harris
2022-11-13 00:15:00 +00:00
parent 5a90dd9312
commit 5a225bf585
2 changed files with 11 additions and 22 deletions

View File

@ -188,22 +188,18 @@ mergeInto(LibraryManager.library, {
* void js_activate_timer();
*
* Start calling the C timer_callback() function every frame.
* The C code ensures that the activate and deactivate functions
* are called in a sensible order.
*/
js_activate_timer: function() {
if (!timer_active) {
timer_reference = performance.now();
var frame = function(now) {
timer = null;
timer_callback((now - timer_reference) / 1000.0);
/* The callback may have deactivated the timer. */
if (timer_active) {
timer_reference = now;
timer = window.requestAnimationFrame(frame);
}
}
timer_active = true;
timer_reference = performance.now();
var frame = function(now) {
timer = window.requestAnimationFrame(frame);
}
// The callback might call js_deactivate_timer() below.
timer_callback((now - timer_reference) / 1000.0);
timer_reference = now;
};
timer = window.requestAnimationFrame(frame);
},
/*
@ -212,13 +208,7 @@ mergeInto(LibraryManager.library, {
* Stop calling the C timer_callback() function every frame.
*/
js_deactivate_timer: function() {
if (timer_active) {
timer_active = false;
if (timer !== null) {
window.cancelAnimationFrame(timer);
timer = null;
}
}
window.cancelAnimationFrame(timer);
},
/*

View File

@ -90,8 +90,7 @@ var midpoint_test_str = "ABCDEFGHIKLMNOPRSTUVWXYZ0123456789";
var midpoint_cache = [];
// Variables used by js_activate_timer() and js_deactivate_timer().
var timer = null;
var timer_active = false;
var timer;
var timer_reference;
// void timer_callback(double tplus);