mirror of
https://github.com/Leo501/CocosCreatorTutorial.git
synced 2026-05-07 22:27:22 +08:00
Merge branch 'master' of https://github.com/Leo501/CocosCreatorTutorial
This commit is contained in:
96
CreatorUtils/ResLoaderMgr.js
Normal file
96
CreatorUtils/ResLoaderMgr.js
Normal file
@@ -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();
|
||||
107
CreatorUtils/ResLoaderMgr.ts
Normal file
107
CreatorUtils/ResLoaderMgr.ts
Normal file
@@ -0,0 +1,107 @@
|
||||
|
||||
|
||||
interface LoadResInfo {
|
||||
name: string,
|
||||
deps: Array<string>
|
||||
}
|
||||
|
||||
export default class ResLoaderMgr {
|
||||
|
||||
//资源引用计数
|
||||
private _resDependKeys: Map<string, number>;
|
||||
private _resInfoMap: Map<string, LoadResInfo>;
|
||||
|
||||
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<string, number>();
|
||||
this._resInfoMap = new Map<string, LoadResInfo>();
|
||||
}
|
||||
|
||||
private _retainDependKey(deps: Array<string>) {
|
||||
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<string>) {
|
||||
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<string>) {
|
||||
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<string> {
|
||||
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();
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user