1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374 |
- import defined from "./defined.js";
- import getTimestamp from "./getTimestamp.js";
- let implementation;
- if (typeof requestAnimationFrame !== "undefined") {
- implementation = requestAnimationFrame;
- }
- (function () {
- // look for vendor prefixed function
- if (!defined(implementation) && typeof window !== "undefined") {
- const vendors = ["webkit", "moz", "ms", "o"];
- let i = 0;
- const len = vendors.length;
- while (i < len && !defined(implementation)) {
- implementation = window[`${vendors[i]}RequestAnimationFrame`];
- ++i;
- }
- }
- // build an implementation based on setTimeout
- if (!defined(implementation)) {
- const msPerFrame = 1000.0 / 60.0;
- let lastFrameTime = 0;
- implementation = function (callback) {
- const currentTime = getTimestamp();
- // schedule the callback to target 60fps, 16.7ms per frame,
- // accounting for the time taken by the callback
- const delay = Math.max(msPerFrame - (currentTime - lastFrameTime), 0);
- lastFrameTime = currentTime + delay;
- return setTimeout(function () {
- callback(lastFrameTime);
- }, delay);
- };
- }
- })();
- /**
- * A browser-independent function to request a new animation frame. This is used to create
- * an application's draw loop as shown in the example below.
- *
- * @function requestAnimationFrame
- *
- * @param {requestAnimationFrameCallback} callback The function to call when the next frame should be drawn.
- * @returns {Number} An ID that can be passed to {@link cancelAnimationFrame} to cancel the request.
- *
- *
- * @example
- * // Create a draw loop using requestAnimationFrame. The
- * // tick callback function is called for every animation frame.
- * function tick() {
- * scene.render();
- * Cesium.requestAnimationFrame(tick);
- * }
- * tick();
- *
- * @see {@link https://www.w3.org/TR/html51/webappapis.html#animation-frames|The Web API Animation Frames interface}
- */
- function requestAnimationFramePolyFill(callback) {
- // we need this extra wrapper function because the native requestAnimationFrame
- // functions must be invoked on the global scope (window), which is not the case
- // if invoked as Cesium.requestAnimationFrame(callback)
- return implementation(callback);
- }
- /**
- * A function that will be called when the next frame should be drawn.
- * @callback requestAnimationFrameCallback
- *
- * @param {Number} timestamp A timestamp for the frame, in milliseconds.
- */
- export default requestAnimationFramePolyFill;
|