mirror of
https://github.com/openseadragon/openseadragon.git
synced 2024-11-25 22:56:11 +03:00
Improved requestAnimationFrame polyfill
Processes all outstanding frame requests per frame, rather than one at a time.
This commit is contained in:
parent
ccbef38297
commit
0112f6a4ea
@ -1675,6 +1675,7 @@ window.OpenSeadragon = window.OpenSeadragon || function( options ){
|
|||||||
};
|
};
|
||||||
} else {
|
} else {
|
||||||
var aAnimQueue = [],
|
var aAnimQueue = [],
|
||||||
|
processing = [],
|
||||||
iRequestId = 0,
|
iRequestId = 0,
|
||||||
iIntervalId;
|
iIntervalId;
|
||||||
|
|
||||||
@ -1685,7 +1686,15 @@ window.OpenSeadragon = window.OpenSeadragon || function( options ){
|
|||||||
if ( !iIntervalId ) {
|
if ( !iIntervalId ) {
|
||||||
iIntervalId = setInterval( function() {
|
iIntervalId = setInterval( function() {
|
||||||
if ( aAnimQueue.length ) {
|
if ( aAnimQueue.length ) {
|
||||||
aAnimQueue.shift( )[ 1 ](+new Date());
|
// Process all of the currently outstanding frame
|
||||||
|
// requests, but none that get added during the
|
||||||
|
// processing.
|
||||||
|
var time = +new Date();
|
||||||
|
processing = aAnimQueue;
|
||||||
|
aAnimQueue = [];
|
||||||
|
while ( processing.length ) {
|
||||||
|
processing.shift()[ 1 ]( time );
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
// don't continue the interval, if unnecessary
|
// don't continue the interval, if unnecessary
|
||||||
clearInterval( iIntervalId );
|
clearInterval( iIntervalId );
|
||||||
@ -1700,12 +1709,22 @@ window.OpenSeadragon = window.OpenSeadragon || function( options ){
|
|||||||
// create a mock cancelAnimationFrame function
|
// create a mock cancelAnimationFrame function
|
||||||
$.cancelAnimationFrame = function( requestId ) {
|
$.cancelAnimationFrame = function( requestId ) {
|
||||||
// find the request ID and remove it
|
// find the request ID and remove it
|
||||||
for ( var i = 0, j = aAnimQueue.length; i < j; i += 1 ) {
|
var i, j;
|
||||||
|
for ( i = 0, j = aAnimQueue.length; i < j; i += 1 ) {
|
||||||
if ( aAnimQueue[ i ][ 0 ] === requestId ) {
|
if ( aAnimQueue[ i ][ 0 ] === requestId ) {
|
||||||
aAnimQueue.splice( i, 1 );
|
aAnimQueue.splice( i, 1 );
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// If it's not in the queue, it may be in the set we're currently
|
||||||
|
// processing.
|
||||||
|
for ( i = 0, j = processing.length; i < j; i += 1 ) {
|
||||||
|
if ( processing[ i ][ 0 ] === requestId ) {
|
||||||
|
processing.splice( i, 1 );
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
})( window );
|
})( window );
|
||||||
|
Loading…
Reference in New Issue
Block a user