246 lines
5.8 KiB
JavaScript
246 lines
5.8 KiB
JavaScript
"use strict";
|
|
cc._RF.push(module, '1fc2e+u85JJLZz+Gd22sTlI', 'nx.assets');
|
|
// Scripts/nx/kernel/nx.assets.js
|
|
|
|
"use strict";
|
|
|
|
/*******************************************************************************
|
|
*
|
|
* Nx 资源缓存
|
|
*
|
|
*
|
|
*
|
|
* 2021.12.10
|
|
******************************************************************************/
|
|
|
|
var NxObject = require("nx.object");
|
|
|
|
// 常驻目录:基础
|
|
var ResidentBase = ["coms"];
|
|
|
|
// 常驻目录:图片
|
|
var ResidentImages = ["resDB/icons"];
|
|
|
|
// 常驻目录:动画
|
|
var ResidentSpines = [];
|
|
|
|
// 常驻目录:预制体
|
|
var ResidentPrefabs = ["prefab/bag", "prefab/battle", "prefab/chat", "prefab/home", "prefab/mainui", "prefab/partner", "prefab/popup", "prefab/push", "prefab/shop", "prefab/summon", "prefab/task"];
|
|
var NxAssets = cc.Class({
|
|
"extends": NxObject,
|
|
name: "NxAssets",
|
|
// 初始化
|
|
initialize: function initialize(_args) {
|
|
// USPER
|
|
if (!this._super(_args)) {
|
|
return false;
|
|
}
|
|
|
|
// 全局服务开启
|
|
nx.assets = this;
|
|
|
|
// 资产缓存表
|
|
this.caches = {};
|
|
|
|
// 常驻资产表
|
|
this.residents = {};
|
|
return true;
|
|
},
|
|
// 销毁
|
|
uninitialize: function uninitialize() {
|
|
// 全局服务关闭
|
|
nx.assets = null;
|
|
|
|
// USPER
|
|
return this._super();
|
|
},
|
|
/**************************************************************
|
|
* 资产管理
|
|
/*************************************************************/
|
|
|
|
// 资产查询
|
|
queryAsset: function queryAsset(_uid) {
|
|
return this.caches[_uid];
|
|
},
|
|
// 资产缓存
|
|
cacheAsset: function cacheAsset(_asset, _skey) {
|
|
// 无效资产
|
|
if (!(_asset instanceof cc.Asset)) {
|
|
return;
|
|
}
|
|
|
|
// 资产ID无效
|
|
var uid = _skey || _asset._uuid;
|
|
if (nx.dt.strEmpty(uid)) {
|
|
nx.error("[资产]缓存失败,资产ID无效!");
|
|
return;
|
|
}
|
|
|
|
// 缓存+1
|
|
_asset.addRef();
|
|
this.caches[uid] = _asset;
|
|
//nx.debug( "[资产]缓存资产[REF:%d]:{%s}", _asset.refCount, uid );
|
|
|
|
// 压入常驻
|
|
this.pushResident(_skey, _asset);
|
|
},
|
|
// 资产释放
|
|
uncacheAsset: function uncacheAsset(_assetOrUid) {
|
|
// UUID
|
|
if (nx.dt.strNEmpty(_assetOrUid)) {
|
|
var key = _assetOrUid;
|
|
var asset = this.caches[key];
|
|
if (!asset) {
|
|
for (var k in this.caches) {
|
|
if (this.caches[k]._uuid == key) {
|
|
asset = this.caches[k];
|
|
key = k;
|
|
break;
|
|
}
|
|
}
|
|
return;
|
|
}
|
|
|
|
// 释放-1
|
|
asset.decRef();
|
|
//nx.debug( "[资产]资产释放[REF:%d]:{%s}", asset.refCount, key );
|
|
if (asset.refCount == 0) {
|
|
delete this.caches[key];
|
|
delete this.residents[key];
|
|
}
|
|
return;
|
|
}
|
|
|
|
// 资产
|
|
if (_assetOrUid instanceof cc.Asset) {
|
|
// 资产ID无效
|
|
var _key = _assetOrUid._uuid;
|
|
for (var _k in this.caches) {
|
|
if (this.caches[_k]._uuid == _key) {
|
|
_key = _k;
|
|
break;
|
|
}
|
|
}
|
|
if (nx.dt.strEmpty(_key)) {
|
|
nx.error("[资产]释放失败,资产ID无效!");
|
|
return;
|
|
}
|
|
|
|
// 释放-1
|
|
_assetOrUid.decRef();
|
|
if (_assetOrUid.refCount == 0) {
|
|
delete this.caches[_key];
|
|
delete this.residents[_key];
|
|
}
|
|
//nx.debug( "[资产]释放资产[REF:%d]:{%s}", _assetOrUid.refCount, key );
|
|
}
|
|
},
|
|
|
|
// 资源全释放
|
|
uncacheAssets: function uncacheAssets(_resident) {
|
|
if (_resident === void 0) {
|
|
_resident = false;
|
|
}
|
|
// 常驻清理
|
|
if (_resident) {
|
|
this.clearResidents();
|
|
}
|
|
|
|
// 其余清理
|
|
for (var key in this.caches) {
|
|
var asset = this.caches[key];
|
|
if (!asset) {
|
|
continue;
|
|
}
|
|
asset.decRef();
|
|
if (asset.refCount > 0) {
|
|
nx.warn("[资产]释放未完全[REF:%d]:{%s}", asset.refCount, key);
|
|
}
|
|
}
|
|
this.caches = {};
|
|
},
|
|
/**************************************************************
|
|
* 常驻资产管理
|
|
/*************************************************************/
|
|
|
|
// 获取常驻
|
|
queryResident: function queryResident(_skey) {
|
|
var res = this.residents[_skey];
|
|
return res;
|
|
},
|
|
// 是否可常驻
|
|
canResident: function canResident(_skey, _asset) {
|
|
// 通用目录
|
|
for (var i in ResidentBase) {
|
|
if (_skey.indexOf(ResidentBase[i]) >= 0) {
|
|
return true;
|
|
}
|
|
}
|
|
|
|
// 类型目录
|
|
var list = null;
|
|
if (_asset instanceof cc.SpriteFrame) {
|
|
list = ResidentImages;
|
|
} else if (_asset instanceof sp.SkeletonData) {
|
|
list = ResidentSpines;
|
|
} else if (_asset instanceof cc.Prefab) {
|
|
list = ResidentPrefabs;
|
|
}
|
|
for (var _i in list) {
|
|
if (_skey.indexOf(list[_i]) >= 0) {
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
},
|
|
// 压入常驻
|
|
pushResident: function pushResident(_skey, _asset) {
|
|
// 已经存在
|
|
var old = this.queryResident(_skey);
|
|
if (old) {
|
|
return true;
|
|
}
|
|
|
|
// 无效
|
|
if (nx.dt.strEmpty(_skey) || !_asset) {
|
|
return false;
|
|
}
|
|
|
|
// 加入常驻表
|
|
var good = this.canResident(_skey, _asset);
|
|
if (good) {
|
|
_asset.addRef();
|
|
this.residents[_skey] = _asset;
|
|
}
|
|
return good;
|
|
},
|
|
// 常驻清理
|
|
clearResidents: function clearResidents() {
|
|
for (var key in this.residents) {
|
|
var res = this.residents[key];
|
|
if (res) {
|
|
res.decRef();
|
|
}
|
|
}
|
|
this.residents = {};
|
|
},
|
|
/**************************************************************
|
|
* 资产调试
|
|
/*************************************************************/
|
|
|
|
// 缓存打印
|
|
dumpAssets: function dumpAssets() {
|
|
//nx.debug( "[资产]当前缓存资产:" )
|
|
for (var uuid in this.caches) {
|
|
var asset = this.caches[uuid];
|
|
if (asset) {
|
|
//nx.debug( "\t\t[REF:%d]:%s", asset.refCount, uuid );
|
|
}
|
|
}
|
|
}
|
|
});
|
|
|
|
// 模块导出
|
|
module.exports = NxAssets;
|
|
|
|
cc._RF.pop(); |