/******************************************************************************* * * Nx 资源缓存 * * * * 2021.12.10 ******************************************************************************/ const NxObject = require( "nx.object" ); // 常驻目录:基础 const ResidentBase = [ "coms" ]; // 常驻目录:图片 const ResidentImages = [ "resDB/icons", ]; // 常驻目录:动画 const ResidentSpines = [ ]; // 常驻目录:预制体 const ResidentPrefabs = [ "prefab/bag", "prefab/battle", "prefab/chat", "prefab/home", "prefab/mainui", "prefab/partner", "prefab/popup", "prefab/push", "prefab/shop", "prefab/summon", "prefab/task", ]; const NxAssets = cc.Class( { extends: NxObject, name: "NxAssets", // 初始化 initialize: function( _args ) { // USPER if( !this._super( _args ) ) { return false; } // 全局服务开启 nx.assets = this; // 资产缓存表 this.caches = {}; // 常驻资产表 this.residents = {}; return true; }, // 销毁 uninitialize: function() { // 全局服务关闭 nx.assets = null; // USPER return this._super(); }, /************************************************************** * 资产管理 /*************************************************************/ // 资产查询 queryAsset: function( _uid ) { return this.caches[ _uid ]; }, // 资产缓存 cacheAsset: function( _asset, _skey ) { // 无效资产 if( !( _asset instanceof cc.Asset ) ) { return; } // 资产ID无效 let 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( _assetOrUid ) { // UUID if( nx.dt.strNEmpty( _assetOrUid ) ) { let key = _assetOrUid; let asset = this.caches[ key ]; if( !asset ) { for( let 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无效 let key = _assetOrUid._uuid; for( let 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( _resident = false ) { // 常驻清理 if( _resident ) { this.clearResidents(); } // 其余清理 for( let key in this.caches ) { let 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( _skey ) { let res = this.residents[ _skey ]; return res; }, // 是否可常驻 canResident: function( _skey, _asset ) { // 通用目录 for( let i in ResidentBase ) { if( _skey.indexOf( ResidentBase[ i ] ) >= 0 ) { return true; } } // 类型目录 let 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( let i in list ) { if( _skey.indexOf( list[ i ] ) >= 0 ) { return true; } } return false; }, // 压入常驻 pushResident: function( _skey, _asset ) { // 已经存在 let old = this.queryResident( _skey ); if( old ) { return true; } // 无效 if( nx.dt.strEmpty( _skey ) || !_asset ) { return false; } // 加入常驻表 let good = this.canResident( _skey, _asset ); if( good ) { _asset.addRef(); this.residents[ _skey ] = _asset; } return good; }, // 常驻清理 clearResidents: function() { for( let key in this.residents ) { let res = this.residents[ key ]; if( res ) { res.decRef(); } } this.residents = {}; }, /************************************************************** * 资产调试 /*************************************************************/ // 缓存打印 dumpAssets: function() { //nx.debug( "[资产]当前缓存资产:" ) for( let uuid in this.caches ) { let asset = this.caches[ uuid ]; if( asset ) { //nx.debug( "\t\t[REF:%d]:%s", asset.refCount, uuid ); } } }, } ); // 模块导出 module.exports = NxAssets;