/// <summary> /// objectManager 提供一个清除缓存的接口 /// </summary> public void ClearCatch() { List <uint> tempList = new List <uint>(); foreach (var key in m_resourcesItemPoolDic.Keys) { List <MResourceObjectItem> mResourceObjectLsit = m_resourcesItemPoolDic[key]; for (int i = mResourceObjectLsit.Count - 1; i >= 0; i--) { MResourceObjectItem mResourceObjectItem = mResourceObjectLsit[i]; m_resourceObjectDic.Remove(mResourceObjectItem.m_cloneObeject.GetInstanceID()); mResourceObjectItem.Reset(); m_resourceObjectClssPool.Recycle(mResourceObjectItem); } if (mResourceObjectLsit.Count <= 0) { tempList.Add(key); } } for (int i = 0; i < tempList.Count; i++) { uint tempKey = tempList[i]; if (m_resourcesItemPoolDic.ContainsKey(tempKey)) { m_resourcesItemPoolDic.Remove(tempKey); } } tempList.Clear(); }
//移除一个节点 public void RemoveNode(MDoubleLinkedListNode <T> mDoubleLinkedListNode) { if (mDoubleLinkedListNode == null) { return; } if (mDoubleLinkedListNode == m_head) { m_head = mDoubleLinkedListNode.m_next; } if (mDoubleLinkedListNode == m_tail) { m_tail = mDoubleLinkedListNode.m_prev; } if (mDoubleLinkedListNode.m_prev != null) { mDoubleLinkedListNode.m_prev.m_next = mDoubleLinkedListNode.m_next; } if (mDoubleLinkedListNode.m_next != null) { mDoubleLinkedListNode.m_next.m_prev = mDoubleLinkedListNode.m_prev; } mDoubleLinkedListNode.m_next = mDoubleLinkedListNode.m_prev = null; mDoubleLinkedListNode.m_t = null; mDoubleLinkedListNodePool.Recycle(mDoubleLinkedListNode); m_count--; }
//释放单个Ab资源 private void UnLoadAssetBundle(string assetBundleName) { MAssetBundleItem mAssetBundleItem = null; uint crc = MCrcHelper.GetCRC32(assetBundleName); if (m_assetBundleItemDic.TryGetValue(crc, out mAssetBundleItem)) { mAssetBundleItem.refCount--; if (mAssetBundleItem.refCount <= 0 && mAssetBundleItem.assetBundle != null) { mAssetBundleItem.assetBundle.Unload(true); mAssetBundleItem.Reset(); m_assetBundleItemPool.Recycle(mAssetBundleItem); m_assetBundleItemDic.Remove(crc); } } }
/// <summary> /// 异步加载的携程 /// </summary> /// <returns></returns> IEnumerator AsyncLoader() { List <AsyncCallBack> callBackList; //用于记录上次的加载时间 long lastReturnTime = System.DateTime.Now.Ticks; while (true) { //标志位 用于判读在For循环中是否已经return过了 bool isYieldReturn = false; for (int i = 0; i < (int)LoadResPriority.RES_LOAD_LEVEL_COUNT; i++) { List <AsyncLoadResParam> cAsyncLoadResList = m_asyncAssetLoadingList[i]; if (m_asyncAssetLoadingList[i] == null) { continue; } if (cAsyncLoadResList.Count <= 0) { continue; } AsyncLoadResParam asyncLoadResParam = cAsyncLoadResList[0]; cAsyncLoadResList.RemoveAt(0); callBackList = asyncLoadResParam.m_asyncCallBacks; Object obj = null; MResourceItem mResourceItem = null; #if UNITY_EDITOR if (!m_isLoadFormAssetBundle) { obj = LoadAssetFormEditor <Object>(asyncLoadResParam.m_resPath); //模拟异步 yield return(new WaitForSeconds(0.2f)); mResourceItem = MAssetBundleManager.singleton.FindResourceItem(asyncLoadResParam.m_crc); if (mResourceItem == null) { mResourceItem = new MResourceItem(); mResourceItem.m_crc = asyncLoadResParam.m_crc; } } #endif if (obj == null) { mResourceItem = MAssetBundleManager.singleton.LoadResourcesAssetBundle(asyncLoadResParam.m_crc); if (mResourceItem != null && mResourceItem.m_assetBundle != null) { AssetBundleRequest assetBundleRequest = null; if (asyncLoadResParam.m_isSprite) { assetBundleRequest = mResourceItem.m_assetBundle.LoadAssetAsync <Sprite>(mResourceItem.m_assetName); } else { assetBundleRequest = mResourceItem.m_assetBundle.LoadAssetAsync(mResourceItem.m_assetName); } yield return(assetBundleRequest); if (assetBundleRequest.isDone) { obj = assetBundleRequest.asset; } lastReturnTime = System.DateTime.Now.Ticks; } } //资源缓存 CacheResource(asyncLoadResParam.m_resPath, ref mResourceItem, asyncLoadResParam.m_crc, obj, callBackList.Count); //处理加载完成的回调 for (int z = 0; z < callBackList.Count; z++) { AsyncCallBack callBack = callBackList[z]; //------------------------异步加载处理需要实例化的资源---------------------------- if (callBack != null && callBack.m_onAsyncLoadObjectFinished != null && callBack.m_resourceObjectItem != null) { MResourceObjectItem mResourceObjectItem = callBack.m_resourceObjectItem; callBack.m_resourceObjectItem.m_resItem = mResourceItem; callBack.m_onAsyncLoadObjectFinished(asyncLoadResParam.m_resPath, callBack.m_resourceObjectItem, callBack.m_resourceObjectItem.m_parms); callBack.m_onAsyncLoadObjectFinished = null; } //------------------------异步加载处理不需要实例化的Object资源---------------------------- if (callBack != null && callBack.m_onAsyncLoadFinished != null) { callBack.m_onAsyncLoadFinished(asyncLoadResParam.m_resPath, obj, callBack.m_parms); callBack.m_onAsyncLoadFinished = null; } //异步加载CallBack对象回收 callBack.Reset(); m_asyncCallBackPool.Recycle(callBack); } obj = null; callBackList.Clear(); //从正在异步加载的Dic里面移除 m_asyncLoadingAssetDic.Remove(mResourceItem.m_crc); //异步加载中间对象回收 asyncLoadResParam.Reset(); m_asyncLoadResParamPool.Recycle(asyncLoadResParam); //上下写了两个同样的Return逻辑 是因为如果加载比较大的资源 可能在这个For循环内就需要多帧 所以这里也做了一个判定 if (!isYieldReturn || System.DateTime.Now.Ticks - lastReturnTime > MAX_WAITTIME) { lastReturnTime = System.DateTime.Now.Ticks; yield return(null); isYieldReturn = true; } } if (!isYieldReturn || System.DateTime.Now.Ticks - lastReturnTime > MAX_WAITTIME) { lastReturnTime = System.DateTime.Now.Ticks; yield return(null); } } }