"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();