From 25e227d7f8c2b794feade0833ba7aab098987339 Mon Sep 17 00:00:00 2001 From: Ian Gulliver Date: Sun, 14 Jul 2019 19:13:47 +0000 Subject: [PATCH] Reduce page size by hacking around chrome concurrency request bug --- Architype.js | 29 ++++++++++++++++++++++++----- render.js | 7 +++++++ 2 files changed, 31 insertions(+), 5 deletions(-) diff --git a/Architype.js b/Architype.js index c0beed8..7cbb28d 100644 --- a/Architype.js +++ b/Architype.js @@ -21,12 +21,16 @@ class Architype { this.renderGeneration_ = -1; this.drawGeneration_ = -1; + // Work around a Chrome cache bug(?) by only starting one render thread at + // first, then starting the rest on first response from that thread. This + // avoids downloading render.js once for each thread. this.render_ = []; - for (let i = 0; i < (navigator.hardwareConcurrency || 2); ++i) { - let render = new Worker('render.js'); - render.addEventListener('message', (e) => { this.onRender(e); }); - this.render_.push(render); - } + this.renderThreadsToStart_ = + Math.min(8, navigator.hardwareConcurrency || 2); + this.renderThreadStart(); + this.render_[0].postMessage({ + command: 'ping', + }); addEventListener('hashchange', (e) => { this.onHashChange(e); }); addEventListener('popstate', (e) => { this.onPopState(e); }); @@ -49,6 +53,13 @@ class Architype { this.snapshot(true); } + renderThreadStart() { + let render = new Worker('render.js'); + render.addEventListener('message', (e) => { this.onRender(e); }); + this.render_.push(render); + --this.renderThreadsToStart_; + } + observe() { this.observer_.observe(this.editorElem_, { attributes: true, @@ -258,6 +269,14 @@ class Architype { } onRender(e) { + while (this.renderThreadsToStart_) { + this.renderThreadStart(); + } + + if (e.data.command == 'pong') { + return; + } + this.render_.push(e.target); if (e.data.generation > this.drawGeneration_) { diff --git a/render.js b/render.js index 6f9530a..3888de5 100644 --- a/render.js +++ b/render.js @@ -1,4 +1,11 @@ addEventListener('message', (e) => { + if (e.data.command == 'ping') { + postMessage({ + command: 'pong', + }); + return; + } + let graph = new Graph(e.data); let layout = new Layout(graph); postMessage({