File size: 2,586 Bytes
bc20498 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 |
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;
|