cache the set of actively monitored blocks

Projects can have 100's of potentially monitored blocks. Caching the
set of monitored blocks can save time in Runtime._step every frame.
This commit is contained in:
Michael "Z" Goddard 2018-11-01 17:14:56 -04:00
parent de86eb3f19
commit a3f9aa1e22
No known key found for this signature in database
GPG key ID: 762CD40DD5349872

View file

@ -63,7 +63,14 @@ class Blocks {
* execute. * execute.
* @type {object.<string, object>} * @type {object.<string, object>}
*/ */
_executeCached: {} _executeCached: {},
/**
* A cache of block IDs and targets to start threads on as they are
* actively monitored.
* @type {Array<{blockId: string, target: Target}>}
*/
_monitored: null
}; };
/** /**
@ -491,6 +498,7 @@ class Blocks {
this._cache.procedureParamNames = {}; this._cache.procedureParamNames = {};
this._cache.procedureDefinitions = {}; this._cache.procedureDefinitions = {};
this._cache._executeCached = {}; this._cache._executeCached = {};
this._cache._monitored = null;
} }
/** /**
@ -667,12 +675,23 @@ class Blocks {
* @param {!object} runtime Runtime to run all blocks in. * @param {!object} runtime Runtime to run all blocks in.
*/ */
runAllMonitored (runtime) { runAllMonitored (runtime) {
Object.keys(this._blocks).forEach(blockId => { if (this._cache._monitored === null) {
if (this.getBlock(blockId).isMonitored) { this._cache._monitored = Object.keys(this._blocks)
const targetId = this.getBlock(blockId).targetId; .filter(blockId => this.getBlock(blockId).isMonitored)
runtime.addMonitorScript(blockId, targetId ? runtime.getTargetById(targetId) : null); .map(blockId => {
} const targetId = this.getBlock(blockId).targetId;
}); return {
blockId,
target: targetId ? runtime.getTargetById(targetId) : null
};
});
}
const monitored = this._cache._monitored;
for (let i = 0; i < monitored.length; i++) {
const {blockId, target} = monitored[i];
runtime.addMonitorScript(blockId, target);
}
} }
/** /**