cytoscape
Version:
Graph theory (a.k.a. network) library for analysis and visualisation
109 lines (75 loc) • 2.59 kB
JavaScript
import * as util from '../../../util';
var BRp = {};
BRp.timeToRender = function(){
return this.redrawTotalTime / this.redrawCount;
};
BRp.redraw = function( options ){
options = options || util.staticEmptyObject();
var r = this;
if( r.averageRedrawTime === undefined ){ r.averageRedrawTime = 0; }
if( r.lastRedrawTime === undefined ){ r.lastRedrawTime = 0; }
if( r.lastDrawTime === undefined ){ r.lastDrawTime = 0; }
r.requestedFrame = true;
r.renderOptions = options;
};
BRp.beforeRender = function( fn, priority ){
// the renderer can't add tick callbacks when destroyed
if( this.destroyed ){ return; }
if( priority == null ){
util.error('Priority is not optional for beforeRender');
}
var cbs = this.beforeRenderCallbacks;
cbs.push({ fn: fn, priority: priority });
// higher priority callbacks executed first
cbs.sort(function( a, b ){ return b.priority - a.priority; });
};
var beforeRenderCallbacks = function( r, willDraw, startTime ){
var cbs = r.beforeRenderCallbacks;
for( var i = 0; i < cbs.length; i++ ){
cbs[i].fn( willDraw, startTime );
}
};
BRp.startRenderLoop = function(){
var r = this;
var cy = r.cy;
if( r.renderLoopStarted ){
return;
} else {
r.renderLoopStarted = true;
}
var renderFn = function( requestTime ){
if( r.destroyed ){ return; }
if( cy.batching() ){
// mid-batch, none of these should run
// - pre frame hooks (calculations, texture caches, style, etc.)
// - any drawing
} else if( r.requestedFrame && !r.skipFrame ){
beforeRenderCallbacks( r, true, requestTime );
var startTime = util.performanceNow();
r.render( r.renderOptions );
var endTime = r.lastDrawTime = util.performanceNow();
if( r.averageRedrawTime === undefined ){
r.averageRedrawTime = endTime - startTime;
}
if( r.redrawCount === undefined ){
r.redrawCount = 0;
}
r.redrawCount++;
if( r.redrawTotalTime === undefined ){
r.redrawTotalTime = 0;
}
var duration = endTime - startTime;
r.redrawTotalTime += duration;
r.lastRedrawTime = duration;
// use a weighted average with a bias from the previous average so we don't spike so easily
r.averageRedrawTime = r.averageRedrawTime / 2 + duration / 2;
r.requestedFrame = false;
} else {
beforeRenderCallbacks( r, false, requestTime );
}
r.skipFrame = false;
util.requestAnimationFrame( renderFn );
};
util.requestAnimationFrame( renderFn );
};
export default BRp;