Merge pull request #563 from rschamp/performance/spriteInfoUpdate

Stop emitting SPRITE_INFO_REPORT
This commit is contained in:
Ray Schamp 2017-05-12 17:45:48 -04:00 committed by GitHub
commit 8f45045af0
3 changed files with 48 additions and 40 deletions

View file

@ -104,6 +104,13 @@ class Runtime extends EventEmitter {
*/ */
this._cloneCounter = 0; this._cloneCounter = 0;
/**
* Flag to emit a targets update at the end of a step. When target data
* changes, this flag is set to true.
* @type {boolean}
*/
this._refreshTargets = false;
/** /**
* Whether the project is in "turbo mode." * Whether the project is in "turbo mode."
* @type {Boolean} * @type {Boolean}
@ -226,11 +233,11 @@ class Runtime extends EventEmitter {
} }
/** /**
* Event name for sprite info report. * Event name for targets update report.
* @const {string} * @const {string}
*/ */
static get SPRITE_INFO_REPORT () { static get TARGETS_UPDATE () {
return 'SPRITE_INFO_REPORT'; return 'TARGETS_UPDATE';
} }
/** /**
@ -638,6 +645,7 @@ class Runtime extends EventEmitter {
* inactive threads after each iteration. * inactive threads after each iteration.
*/ */
_step () { _step () {
this._refreshTargets = false;
// Find all edge-activated hats, and add them to threads to be evaluated. // Find all edge-activated hats, and add them to threads to be evaluated.
for (const hatType in this._hats) { for (const hatType in this._hats) {
if (!this._hats.hasOwnProperty(hatType)) continue; if (!this._hats.hasOwnProperty(hatType)) continue;
@ -655,6 +663,7 @@ class Runtime extends EventEmitter {
// @todo: Only render when this.redrawRequested or clones rendered. // @todo: Only render when this.redrawRequested or clones rendered.
this.renderer.draw(); this.renderer.draw();
} }
if (this._refreshTargets) this.emit(Runtime.TARGETS_UPDATE);
} }
/** /**
@ -673,7 +682,7 @@ class Runtime extends EventEmitter {
// Script glows must be cleared. // Script glows must be cleared.
this._scriptGlowsPreviousFrame = []; this._scriptGlowsPreviousFrame = [];
this._updateGlows(); this._updateGlows();
this.spriteInfoReport(editingTarget); this.requestTargetsUpdate(editingTarget);
} }
/** /**
@ -809,16 +818,6 @@ class Runtime extends EventEmitter {
this.emit(Runtime.VISUAL_REPORT, {id: blockId, value: String(value)}); this.emit(Runtime.VISUAL_REPORT, {id: blockId, value: String(value)});
} }
/**
* Emit a sprite info report if the provided target is the original sprite
* @param {!Target} target Target to report sprite info for.
*/
spriteInfoReport (target) {
if (!target.isOriginal) return;
this.emit(Runtime.SPRITE_INFO_REPORT, target.toJSON());
}
/** /**
* Get a target by its id. * Get a target by its id.
* @param {string} targetId Id of target to find. * @param {string} targetId Id of target to find.
@ -896,6 +895,16 @@ class Runtime extends EventEmitter {
this.redrawRequested = true; this.redrawRequested = true;
} }
/**
* Emit a targets update at the end of the step if the provided target is
* the original sprite
* @param {!Target} target Target requesting the targets update
*/
requestTargetsUpdate (target) {
if (!target.isOriginal) return;
this._refreshTargets = true;
}
/** /**
* Set up timers to repeatedly step in a browser. * Set up timers to repeatedly step in a browser.
*/ */

View file

@ -197,7 +197,7 @@ class RenderedTarget extends Target {
this.y = y; this.y = y;
} }
this.emit(RenderedTarget.EVENT_TARGET_MOVED, this, oldX, oldY); this.emit(RenderedTarget.EVENT_TARGET_MOVED, this, oldX, oldY);
this.runtime.spriteInfoReport(this); this.runtime.requestTargetsUpdate(this);
} }
/** /**
@ -240,7 +240,7 @@ class RenderedTarget extends Target {
this.runtime.requestRedraw(); this.runtime.requestRedraw();
} }
} }
this.runtime.spriteInfoReport(this); this.runtime.requestTargetsUpdate(this);
} }
/** /**
@ -250,7 +250,7 @@ class RenderedTarget extends Target {
setDraggable (draggable) { setDraggable (draggable) {
if (this.isStage) return; if (this.isStage) return;
this.draggable = !!draggable; this.draggable = !!draggable;
this.runtime.spriteInfoReport(this); this.runtime.requestTargetsUpdate(this);
} }
/** /**
@ -287,7 +287,7 @@ class RenderedTarget extends Target {
this.runtime.requestRedraw(); this.runtime.requestRedraw();
} }
} }
this.runtime.spriteInfoReport(this); this.runtime.requestTargetsUpdate(this);
} }
/** /**
@ -386,7 +386,7 @@ class RenderedTarget extends Target {
this.runtime.requestRedraw(); this.runtime.requestRedraw();
} }
} }
this.runtime.spriteInfoReport(this); this.runtime.requestTargetsUpdate(this);
} }
/** /**
@ -411,7 +411,7 @@ class RenderedTarget extends Target {
this.runtime.requestRedraw(); this.runtime.requestRedraw();
} }
} }
this.runtime.spriteInfoReport(this); this.runtime.requestTargetsUpdate(this);
} }
/** /**
@ -483,7 +483,7 @@ class RenderedTarget extends Target {
this.runtime.requestRedraw(); this.runtime.requestRedraw();
} }
} }
this.runtime.spriteInfoReport(this); this.runtime.requestTargetsUpdate(this);
} }
/** /**

View file

@ -19,42 +19,41 @@ class VirtualMachine extends EventEmitter {
constructor () { constructor () {
super(); super();
const instance = this;
/** /**
* VM runtime, to store blocks, I/O devices, sprites/targets, etc. * VM runtime, to store blocks, I/O devices, sprites/targets, etc.
* @type {!Runtime} * @type {!Runtime}
*/ */
instance.runtime = new Runtime(); this.runtime = new Runtime();
/** /**
* The "currently editing"/selected target ID for the VM. * The "currently editing"/selected target ID for the VM.
* Block events from any Blockly workspace are routed to this target. * Block events from any Blockly workspace are routed to this target.
* @type {!string} * @type {!string}
*/ */
instance.editingTarget = null; this.editingTarget = null;
// Runtime emits are passed along as VM emits. // Runtime emits are passed along as VM emits.
instance.runtime.on(Runtime.SCRIPT_GLOW_ON, glowData => { this.runtime.on(Runtime.SCRIPT_GLOW_ON, glowData => {
instance.emit(Runtime.SCRIPT_GLOW_ON, glowData); this.emit(Runtime.SCRIPT_GLOW_ON, glowData);
}); });
instance.runtime.on(Runtime.SCRIPT_GLOW_OFF, glowData => { this.runtime.on(Runtime.SCRIPT_GLOW_OFF, glowData => {
instance.emit(Runtime.SCRIPT_GLOW_OFF, glowData); this.emit(Runtime.SCRIPT_GLOW_OFF, glowData);
}); });
instance.runtime.on(Runtime.BLOCK_GLOW_ON, glowData => { this.runtime.on(Runtime.BLOCK_GLOW_ON, glowData => {
instance.emit(Runtime.BLOCK_GLOW_ON, glowData); this.emit(Runtime.BLOCK_GLOW_ON, glowData);
}); });
instance.runtime.on(Runtime.BLOCK_GLOW_OFF, glowData => { this.runtime.on(Runtime.BLOCK_GLOW_OFF, glowData => {
instance.emit(Runtime.BLOCK_GLOW_OFF, glowData); this.emit(Runtime.BLOCK_GLOW_OFF, glowData);
}); });
instance.runtime.on(Runtime.PROJECT_RUN_START, () => { this.runtime.on(Runtime.PROJECT_RUN_START, () => {
instance.emit(Runtime.PROJECT_RUN_START); this.emit(Runtime.PROJECT_RUN_START);
}); });
instance.runtime.on(Runtime.PROJECT_RUN_STOP, () => { this.runtime.on(Runtime.PROJECT_RUN_STOP, () => {
instance.emit(Runtime.PROJECT_RUN_STOP); this.emit(Runtime.PROJECT_RUN_STOP);
}); });
instance.runtime.on(Runtime.VISUAL_REPORT, visualReport => { this.runtime.on(Runtime.VISUAL_REPORT, visualReport => {
instance.emit(Runtime.VISUAL_REPORT, visualReport); this.emit(Runtime.VISUAL_REPORT, visualReport);
}); });
instance.runtime.on(Runtime.SPRITE_INFO_REPORT, spriteInfo => { this.runtime.on(Runtime.TARGETS_UPDATE, () => {
instance.emit(Runtime.SPRITE_INFO_REPORT, spriteInfo); this.emitTargetsUpdate();
}); });
this.blockListener = this.blockListener.bind(this); this.blockListener = this.blockListener.bind(this);