UNPKG

@clementroche/raf

Version:

This package implements a ticker using only one requestAnimationFrame

2 lines (1 loc) 2.28 kB
!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t="undefined"!=typeof globalThis?globalThis:t||self).Events=e()}(this,(function(){"use strict";function t(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function e(t,e){for(var i=0;i<e.length;i++){var n=e[i];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,n.key,n)}}function i(t,i,n){return i&&e(t.prototype,i),n&&e(t,n),t}var n=function(){function e(i){t(this,e),this.autoStart=void 0===i||i,this.startTime=0,this.oldTime=0,this.elapsedTime=0,this.running=!1}return i(e,[{key:"start",value:function(){this.startTime=("undefined"==typeof performance?Date:performance).now(),this.oldTime=this.startTime,this.elapsedTime=0,this.running=!0}},{key:"stop",value:function(){this.getElapsedTime(),this.running=!1,this.autoStart=!1}},{key:"getElapsedTime",value:function(){return this.getDelta(),this.elapsedTime}},{key:"getDelta",value:function(){var t=0;if(this.autoStart&&!this.running)return this.start(),0;if(this.running){var e=("undefined"==typeof performance?Date:performance).now();t=(e-this.oldTime)/1e3,this.oldTime=e,this.elapsedTime+=t}return t}}]),e}();return function(){function e(){var i=arguments.length>0&&void 0!==arguments[0]?arguments[0]:60;t(this,e),this.rafs={},this.clock=new n,this.fps=i,this.latest=0,this.delta=0,this.optimumDeltaTime=this.frameDuration/1e3,this.loop()}return i(e,[{key:"dispatch",value:function(){var t=this.clock.getDelta(),e=this.clock.getElapsedTime(),i=t/(1e3/60/1e3);Object.values(this.rafs).sort((function(t,e){return t.priority-e.priority})).forEach((function(n){n.callback({time:e,deltaTime:t,lagSmoothing:i})}))}},{key:"loop",value:function(){var t=performance.now();this.delta=t-this.latest,this.delta>this.frameDuration&&this.dispatch(),this.latest=t-this.delta%this.frameDuration,requestAnimationFrame(this.loop.bind(this))}},{key:"add",value:function(t,e){var i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:0;this.rafs[t]||(this.rafs[t]={id:t,callback:e,priority:i})}},{key:"remove",value:function(t){delete this.rafs[t]}},{key:"frameDuration",get:function(){return 1e3/this.fps}}]),e}()}));