From 66318c33551c14ea5c76365ddec033c26b8b78ff Mon Sep 17 00:00:00 2001 From: Vladimir Mandic Date: Wed, 2 Jun 2021 16:46:07 -0400 Subject: [PATCH] switch worker from module to iife importscripts --- demo/index-worker.js | 8 ++++++-- demo/index.js | 4 +++- src/interpolate.ts | 10 +++++++++- 3 files changed, 18 insertions(+), 4 deletions(-) diff --git a/demo/index-worker.js b/demo/index-worker.js index 88e17230..231abc85 100644 --- a/demo/index-worker.js +++ b/demo/index-worker.js @@ -1,7 +1,11 @@ -import Human from '../dist/human.esm.js'; +// load Human using IIFE script as Chome Mobile does not support Modules as Workers +// import Human from '../dist/human.esm.js'; +self.importScripts('../dist/human.js'); let busy = false; -const human = new Human(); +// @ts-ignore // Human is registered as global namespace using IIFE script +// eslint-disable-next-line no-undef, new-cap +const human = new Human.default(); function log(...msg) { const dt = new Date(); diff --git a/demo/index.js b/demo/index.js index d9d124e1..bf6767cd 100644 --- a/demo/index.js +++ b/demo/index.js @@ -387,7 +387,9 @@ function webWorker(input, image, canvas, timestamp) { if (!worker) { // create new webworker and add event handler only once log('creating worker thread'); - worker = new Worker(ui.worker, { type: 'module' }); + // load Human using IIFE script as Chome Mobile does not support Modules as Workers + // worker = new Worker(ui.worker, { type: 'module' }); + worker = new Worker(ui.worker); // after receiving message from webworker, parse&draw results and send new frame for processing worker.addEventListener('message', (msg) => { if (msg.data.result.performance && msg.data.result.performance.total) ui.detectFPS.push(1000 / msg.data.result.performance.total); diff --git a/src/interpolate.ts b/src/interpolate.ts index 58386dc4..0009e23a 100644 --- a/src/interpolate.ts +++ b/src/interpolate.ts @@ -11,7 +11,15 @@ export function calc(newResult: Result): Result { // otherwise bufferedResult is a shallow clone of result plus updated local calculated values // thus mixing by-reference and by-value assignments to minimize memory operations - const bufferedFactor = 1000 / (Date.now() - newResult.timestamp) / 4; + const elapsed = Date.now() - newResult.timestamp; + // curve fitted: buffer = 8 - ln(delay) + // interpolation formula: current = ((buffer - 1) * previous + live) / buffer + // - at 50ms delay buffer = ~4.1 => 28% towards live data + // - at 250ms delay buffer = ~2.5 => 40% towards live data + // - at 500ms delay buffer = ~1.8 => 55% towards live data + // - at 750ms delay buffer = ~1.4 => 71% towards live data + // - at 1sec delay buffer = 1 which means live data is used + const bufferedFactor = elapsed < 1000 ? 8 - Math.log(elapsed) : 1; // interpolate body results if (!bufferedResult.body || (newResult.body.length !== bufferedResult.body.length)) {