UNPKG

dragonbones-runtime

Version:

the tools to build dragonbones file for diffrent framework

211 lines (198 loc) 6.75 kB
////////////////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2014-present, Egret Technology. // All rights reserved. // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // * Neither the name of the Egret nor the // names of its contributors may be used to endorse or promote products // derived from this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY EGRET AND CONTRIBUTORS "AS IS" AND ANY EXPRESS // OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES // OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL EGRET AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, // INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;LOSS OF USE, DATA, // OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF // LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, // EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // ////////////////////////////////////////////////////////////////////////////////////// namespace egret { /** * Tool class for object cache repeat use, which can be used to construct an object pool. Objects are automatically recycled after a certain duration. * @version Egret 2.4 * @platform Web,Native * @includeExample extension/game/utils/Recycler.ts * @private * @language en_US */ /** * 对象缓存复用工具类,可用于构建对象池,一段时间后会自动回收对象。 * @version Egret 2.4 * @platform Web,Native * @includeExample extension/game/utils/Recycler.ts * @private * @language zh_CN */ export class Recycler extends HashObject{ /** * Create an egret.Recycler object * @param autoDisposeTime {number} Number of frames when objects are destroyed automatically. Default value: 300 * @version Egret 2.4 * @platform Web,Native * @language en_US */ /** * 创建一个 egret.Recycler 对象 * @param autoDisposeTime {number} 多少帧后自动销毁对象,默认值300 * @version Egret 2.4 * @platform Web,Native * @language zh_CN */ public constructor(autoDisposeTime:number = 300){ super(); if(autoDisposeTime<1) autoDisposeTime = 1; this.autoDisposeTime = autoDisposeTime; this.frameCount = 0; } /** * @private */ public static _callBackList:any[] = []; public static $init():void { ticker.$startTick(Recycler.onUpdate, Recycler); } public static onUpdate(timeStamp:number):boolean { let list = Recycler._callBackList; for (let i = list.length - 1; i >= 0; i--) { list[i].$checkFrame(); } return false; } /** * @private * 多少帧后自动销毁对象。 */ private autoDisposeTime:number; /** * @private */ private frameCount:number; /** * @private * */ public $checkFrame():void{ this.frameCount--; if(this.frameCount<=0){ this.dispose(); } } /** * @private */ private objectPool:any[] = []; /** * @private */ private _length:number = 0; /** * Number of cached objects" * @version Egret 2.4 * @platform Web,Native * @language en_US */ /** * 缓存的对象数量 * @version Egret 2.4 * @platform Web,Native * @language zh_CN */ public get length():number{ return this._length; } /** * Cache an object for repeat use * @param object {any} The object to be cached * @version Egret 2.4 * @platform Web,Native * @language en_US */ /** * 缓存一个对象以复用 * @param object {any} 需要缓存的对象 * @version Egret 2.4 * @platform Web,Native * @language zh_CN */ public push(object:any):void{ let pool:any[] = this.objectPool; if(pool.indexOf(object)==-1){ pool.push(object); if (object.__recycle) { object.__recycle(); } this._length++; if(this.frameCount==0){ this.frameCount = this.autoDisposeTime; Recycler._callBackList.push(this); } } } /** * Obtain a cached object * @returns {any} The obtained cached object * @version Egret 2.4 * @platform Web,Native * @language en_US */ /** * 获取一个缓存的对象 * @returns {any} 获得的缓存对象 * @version Egret 2.4 * @platform Web,Native * @language zh_CN */ public pop():any{ if(this._length==0) return null; this._length--; return this.objectPool.pop(); } /** * Immediately clear all cached objects. * @version Egret 2.4 * @platform Web,Native * @language en_US */ /** * 立即清空所有缓存的对象。 * @version Egret 2.4 * @platform Web,Native * @language zh_CN */ public dispose():void{ if(this._length>0){ this.objectPool = []; this._length = 0; } this.frameCount = 0; let list:any[] = Recycler._callBackList; let index:number = list.indexOf(this); if(index!=-1){ list.splice(index,1); } } } Recycler.$init(); }