File size: 2,634 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 |
import * as util from '../../../util';
var fullFpsTime = 1000/60; // assume 60 frames per second
export default {
setupDequeueing: function( opts ){
return function setupDequeueingImpl(){
var self = this;
var r = this.renderer;
if( self.dequeueingSetup ){
return;
} else {
self.dequeueingSetup = true;
}
var queueRedraw = util.debounce( function(){
r.redrawHint( 'eles', true );
r.redrawHint( 'drag', true );
r.redraw();
}, opts.deqRedrawThreshold );
var dequeue = function( willDraw, frameStartTime ){
var startTime = util.performanceNow();
var avgRenderTime = r.averageRedrawTime;
var renderTime = r.lastRedrawTime;
var deqd = [];
var extent = r.cy.extent();
var pixelRatio = r.getPixelRatio();
// if we aren't in a tick that causes a draw, then the rendered style
// queue won't automatically be flushed before dequeueing starts
if( !willDraw ){
r.flushRenderedStyleQueue();
}
while( true ){ // eslint-disable-line no-constant-condition
var now = util.performanceNow();
var duration = now - startTime;
var frameDuration = now - frameStartTime;
if( renderTime < fullFpsTime ){
// if we're rendering faster than the ideal fps, then do dequeueing
// during all of the remaining frame time
var timeAvailable = fullFpsTime - ( willDraw ? avgRenderTime : 0 );
if( frameDuration >= opts.deqFastCost * timeAvailable ){
break;
}
} else {
if( willDraw ){
if(
duration >= opts.deqCost * renderTime
|| duration >= opts.deqAvgCost * avgRenderTime
){
break;
}
} else if( frameDuration >= opts.deqNoDrawCost * fullFpsTime ){
break;
}
}
var thisDeqd = opts.deq( self, pixelRatio, extent );
if( thisDeqd.length > 0 ){
for( var i = 0; i < thisDeqd.length; i++ ){
deqd.push( thisDeqd[i] );
}
} else {
break;
}
}
// callbacks on dequeue
if( deqd.length > 0 ){
opts.onDeqd( self, deqd );
if( !willDraw && opts.shouldRedraw( self, deqd, pixelRatio, extent ) ){
queueRedraw();
}
}
};
var priority = opts.priority || util.noop;
r.beforeRender( dequeue, priority( self ) );
};
}
};
|