From 602740ce596a2e456c9df61b1c1d5d17216ed3c1 Mon Sep 17 00:00:00 2001 From: Leo <907600065@qq.com> Date: Sun, 27 Oct 2019 18:05:47 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E4=B8=80=E4=B8=AA=E5=85=B3?= =?UTF-8?q?=E4=BA=8E=E5=86=85=E5=AD=98=E7=AE=A1=E7=90=86=E7=9A=84=E7=B1=BB?= =?UTF-8?q?=EF=BC=8C=E9=87=87=E7=94=A8=E5=BC=95=E7=94=A8=E8=AE=A1=E6=95=B0?= =?UTF-8?q?=E6=9D=A5=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CreatorUtils/ResLoaderMgr.js | 96 +++++++++++++++++++++++++++++++ CreatorUtils/ResLoaderMgr.ts | 107 +++++++++++++++++++++++++++++++++++ 2 files changed, 203 insertions(+) create mode 100644 CreatorUtils/ResLoaderMgr.js create mode 100644 CreatorUtils/ResLoaderMgr.ts diff --git a/CreatorUtils/ResLoaderMgr.js b/CreatorUtils/ResLoaderMgr.js new file mode 100644 index 0000000..c072fb3 --- /dev/null +++ b/CreatorUtils/ResLoaderMgr.js @@ -0,0 +1,96 @@ + + +class ResLoaderMgr { + + constructor() { + this._init(); + } + + _init() { + this._resDependKeys = new Map(); + this._resInfoMap = new Map(); + } + + _retainDependKey(deps) { + if (!Array.isArray(deps)) { + console.log('deps is not array', deps); + } else { + deps.forEach(key => { + if (!this._resDependKeys.has(key)) { + this._resDependKeys.set(key, 0); + } + let totalCount = this._resDependKeys.get(key) + 1; + this._resDependKeys.set(key, totalCount); + }); + } + } + + _getReleseDepends(deps) { + let relese = []; + if (!Array.isArray(deps)) { + console.log('deps is not array', deps); + } else { + deps.forEach(key => { + if (!this._resDependKeys.has(key)) { + relese.push(key); + } else { + let totalCount = this._resDependKeys.get(key); + if (totalCount > 1) { + this._resDependKeys.set(key, totalCount - 1); + } else { + this._resDependKeys.delete(key); + relese.push(key); + } + } + }); + } + return relese; + } + + /** + * 引用加1 + * @param {*} name + * @param {*} deps + */ + _retainResInfo(name, deps) { + let resInfo = { name, deps }; + this._resInfoMap.set(name, resInfo); + this._retainDependKey(deps); + } + + /** + * 取得依赖 + * @param {*} target + */ + getResDeps(target) { + return cc.loader.getDependsRecursively(target); + } + + retainByName(name, asset) { + let deps = this.getResDeps(asset); + this._retainResInfo(name, deps); + } + + /** + * 释放依赖 + * @param {*} name + */ + releseByName(name) { + let resInfo = this._resInfoMap.get(name); + if (!resInfo) { + console.log('resInfo is null') + } else { + let releseDeps = this._getReleseDepends(resInfo.deps); + console.log('releseDeps', releseDeps); + releseDeps.forEach(key => { + cc.loader.release(key); + }) + } + } + + clearArr() { + this._init(); + } +} + +module.exports = new ResLoaderMgr(); diff --git a/CreatorUtils/ResLoaderMgr.ts b/CreatorUtils/ResLoaderMgr.ts new file mode 100644 index 0000000..066e21a --- /dev/null +++ b/CreatorUtils/ResLoaderMgr.ts @@ -0,0 +1,107 @@ + + +interface LoadResInfo { + name: string, + deps: Array +} + +export default class ResLoaderMgr { + + //资源引用计数 + private _resDependKeys: Map; + private _resInfoMap: Map; + + private static _instance: ResLoaderMgr; + public static Instance(): ResLoaderMgr { + if (!ResLoaderMgr._instance) { + ResLoaderMgr._instance = new ResLoaderMgr(); + } + return ResLoaderMgr._instance; + } + + private constructor() { + this._init(); + } + + private _init() { + this._resDependKeys = new Map(); + this._resInfoMap = new Map(); + } + + private _retainDependKey(deps: Array) { + if (!Array.isArray(deps)) { + console.warn('deps is not array', deps); + } else { + deps.forEach(key => { + if (!this._resDependKeys.has(key)) { + this._resDependKeys.set(key, 0); + } + let totalCount = this._resDependKeys.get(key) + 1; + this._resDependKeys.set(key, totalCount); + }); + } + } + + private _getReleseDepends(deps: Array) { + let relese = []; + if (!Array.isArray(deps)) { + console.warn('deps is not array', deps); + } else { + deps.forEach(key => { + if (!this._resDependKeys.has(key)) { + relese.push(key); + } else { + let totalCount = this._resDependKeys.get(key); + if (totalCount > 1) { + this._resDependKeys.set(key, totalCount - 1); + } else { + this._resDependKeys.delete(key); + relese.push(key); + } + } + + }); + } + return relese; + } + + /** + * 记录 某个资源 + * @param name + * @param deps + */ + private _retainResInfo(name: string, deps: Array) { + let resInfo: LoadResInfo = { name, deps }; + this._resInfoMap.set(name, resInfo); + this._retainDependKey(deps); + } + + public getResDeps(target: cc.SceneAsset | cc.AudioClip | cc.Prefab | cc.SpriteFrame): Array { + return cc.loader.getDependsRecursively(target); + } + + public retainByName(name, asset: cc.SceneAsset | cc.AudioClip | cc.Prefab | cc.SpriteFrame) { + let deps = this.getResDeps(asset); + this._retainResInfo(name, deps); + } + + public releseByName(name: string) { + let resInfo = this._resInfoMap.get(name); + if (!resInfo) { + console.warn('resInfo is null') + } else { + let releseDeps = this._getReleseDepends(resInfo.deps); + console.log('releseDeps', releseDeps); + releseDeps.forEach(key => { + cc.loader.release(key); + }) + } + } + + public clearAll() { + delete this._resDependKeys; + delete this._resInfoMap; + this._init(); + } + +}