/// <summary> /// 创建需要加载的LocalAssetResource,如果存在就获取,添加到下载链表中 /// </summary> /// <param name="resource"></param> /// <param name="handler"></param> /// <param name="assetPRI"></param> /// <returns></returns> public LocalAssetResource CreateAssetResource(ResourceData resource, AssetLoadFinishedEventHandler handler, AssetPRI assetPRI) { if (resource == null) { return(null); } string mPath = resource.mPath; string key = Path.GetFileNameWithoutExtension(mPath).ToLower();//获取文件名,不包括扩展名 LocalAssetResource assetResource = new LocalAssetResource(resource); if (!this.m_dicAssetResoure.ContainsKey(key))//如果不包含这个资源,就创建资源然后添加到资源集合中 { assetResource = new LocalAssetResource(resource); assetResource.PRIType = assetPRI; this.m_dicAssetResoure.Add(key, assetResource); if (this.m_allLoadFinishedEventHandler != null) { this.m_total += assetResource.Size; } Debug.Log(assetResource.URL + "添加到下载链表!"); this.m_linkedListNeedToLoad.AddLast(assetResource);//把需要加载的资源添加到链表的最后 } else { assetResource = this.m_dicAssetResoure[key]; Debug.Log("之前已经加载过了:" + assetResource.URL); } if (handler != null && !assetResource.Canceled)//设置加载完成之后的委托 { assetResource.SetLoadFinishedHandler((AssetLoadFinishedEventHandler)Delegate.Combine(assetResource.GetLoadFinishedHandler(), handler)); } return(assetResource); }
/// <summary> /// 检测资源是否下载出错 /// </summary> /// <returns></returns> private bool DetectAllHasFinished() { if (this.m_assetResource != null) { if (!this.m_assetResource.HasCallBack)//如果完成的话,就检测资源是否下载出错 { return(false); } this.DeceteResourceError(this.m_assetResource); } if (this.m_depAssetResources != null) { for (int i = 0; i < this.m_depAssetResources.Length; i++) { LocalAssetResource resource = this.m_depAssetResources[i]; if (resource != null) { if (!resource.HasCallBack) { return(false); } this.DeceteResourceError(resource); } } } return(true); }
/// <summary> /// 添加引用资源,赋值depAssetResource[] /// </summary> /// <param name="depSO">需要添加的资源</param> /// <param name="index">添加到哪个位置</param> public void AddDep(IAssetResource depSO, int index) { LocalAssetResource assetResource = depSO as LocalAssetResource; if (assetResource != null && this.m_depAssetResources != null && index < this.m_depAssetResources.Length && index >= 0 && !this.HasAssetResource(assetResource)) { this.m_depAssetResources[index] = assetResource; assetResource.AddRef(); } }
/// <summary> /// 设置当前资源,初始化assetResource /// </summary> /// <param name="assetSO"></param> public void SetAsset(IAssetResource assetSO) { if (this.m_assetResource != null) { AssetLogger.Error(string.Format("null != m_assetResource:{0}", this.GetAssetResourceStates())); return; } if (assetSO != null) { this.m_assetResource = assetSO as LocalAssetResource; this.m_assetResource.AddRef(); } }
public void Clear() { while (this.assetResourceQueue.Count > 0) { LocalAssetResource resource = this.assetResourceQueue.Dequeue(); resource.Dispose(); } this.assetResourceQueue.Clear(); foreach (LocalAssetResource current in this.m_dicAssetResoure.Values) { current.Dispose(); } this.m_dicAssetResoure.Clear(); this.m_dicAssetCollectDepResource.Clear(); }
/// <summary> /// 卸载Assetbundle内存镜像引用 /// </summary> private void UnloadAssetBundle() { if (this.m_depAssetResources != null) { for (int i = 0; i < this.m_depAssetResources.Length; i++) { LocalAssetResource resource = this.m_depAssetResources[i]; if (resource != null) { resource.UnloadAsset(); } } } if (this.m_assetResource != null) { this.m_assetResource.UnloadAsset(); } }
/// <summary> /// 加载带有引用资源的资源(包括自身和引用资源)的主资源 /// </summary> private void LoadMainAsset() { if (this.m_depAssetResources != null) { for (int i = 0; i < this.m_depAssetResources.Length; i++) { LocalAssetResource resource = this.m_depAssetResources[i]; if (resource != null) { resource.LoadMainAsset();//加载引用资源的主资源 } } } if (this.m_assetResource != null) { this.m_assetResource.LoadMainAsset();//加载当前资源的主资源 } }
/// <summary> /// 查看引用资源数组里面是否已经包含该资源 /// </summary> /// <param name="resource"></param> /// <returns></returns> public bool HasAssetResource(LocalAssetResource resource) { if (this.m_assetResource == resource) { return(true); } if (this.m_depAssetResources != null) { for (int i = 0; i < this.m_depAssetResources.Length; i++) { LocalAssetResource depResource = this.m_depAssetResources[i]; if (depResource == resource) { return(true); } } } return(false); }
public string GetAssetResourceStates() { StringBuilder stringBuilder = new StringBuilder(128); if (this.m_assetResource != null) { stringBuilder.AppendFormat("{0}:{1}.{2}", this.m_assetResource.URL, this.m_assetResource.IsDone, this.m_assetResource.Error); } if (this.m_depAssetResources != null) { for (int i = 0; i < this.m_depAssetResources.Length; i++) { LocalAssetResource assetResource = this.m_depAssetResources[i]; if (assetResource != null) { stringBuilder.AppendFormat("{0}:{1}.{2}", assetResource.URL, assetResource.IsDone, assetResource.Error); } } } return(stringBuilder.ToString()); }
private void Clear() { if (this.m_assetResource != null) { this.m_assetResource.DelRef(); this.m_assetResource = null; } if (this.m_depAssetResources != null) { for (int i = 0; i < this.m_depAssetResources.Length; i++) { LocalAssetResource assetResource = this.m_depAssetResources[i]; if (assetResource != null) { Debug.Log("dep :" + assetResource.URL + "delref:" + assetResource.RefCount); assetResource.DelRef(); } } this.m_depAssetResources = null; } }
/// <summary> /// 检测哪些资源在加载是出错,就添加到listAssetResource集合里面去 /// </summary> /// <param name="resource"></param> private void DeceteResourceError(LocalAssetResource resource) { if (resource != null) { if (string.IsNullOrEmpty(resource.Error)) //如果资源下载没出错的话 { if (this.m_listErrorAsset.Contains(resource)) //如果存在的话,表示第一次下载出错,第二次正确,就移除 { this.m_listErrorAsset.Remove(resource); return; } } else { if (!this.m_listErrorAsset.Contains(resource)) { this.m_listErrorAsset.Add(resource); } } } }
public IAssetRequest CreateAssetRequest(ResourceData resourceData, List <ResourceData> depResourceList, AssetRequestFinishedEventHandler callback, AssetPRI assetPRI) { if (resourceData == null) { return(null); } AssetLogger.Debug("CreateAssetRequest:" + resourceData.mResourceName); if (string.IsNullOrEmpty(resourceData.mPath)) { return(null); } LocalAssetCollectDepResource depResource = null; if (this.m_dicAssetCollectDepResource.TryGetValue(resourceData.mPath, out depResource)) { return(new LocalAssetRequest(depResource, callback)); } depResource = LocalAssetCollectDepResource.Create(); depResource.URL = resourceData.mPath; this.m_dicAssetCollectDepResource.Add(depResource.URL, depResource); if (depResourceList != null) { depResource.SetDepSize(depResourceList.Count);//初始化depAssetResource[],引用资源的数组 for (int i = 0; i < depResourceList.Count; i++) { ResourceData resourceData2 = depResourceList[i]; Debug.Log(resourceData2.mResourceName); LocalAssetResource assetResource = this.CreateAssetResource(resourceData2, new AssetLoadFinishedEventHandler(depResource.AssetComplete), assetPRI); depResource.AddDep(assetResource, i);//赋值depAssetResource[] Debug.Log(assetResource == null); } } LocalAssetResource asset = this.CreateAssetResource(resourceData, new AssetLoadFinishedEventHandler(depResource.AssetComplete), assetPRI); depResource.SetAsset(asset); depResource.EndCreate(); return(new LocalAssetRequest(depResource, callback)); }
/// <summary> /// 释放没用的资源 /// </summary> /// <returns></returns> private bool UnLoadNotUsedResource() { bool result = false; List <string> list = new List <string>(); foreach (var current in this.m_dicAssetResoure) { //如果资源被引用的次数为0,就加入到需要被卸载的列表内 if (0 >= current.Value.RefCount) { Debug.Log("UnloadADd:" + current.Key); list.Add(current.Key); } } //遍历所有需要卸载的列表,释放资源 for (int i = 0; i < list.Count; i++) { string key = list[i]; LocalAssetResource assetResource = null; if (this.m_dicAssetResoure.TryGetValue(key, out assetResource)) { if (assetResource != null) { Debug.Log("dispose" + assetResource.URL); assetResource.Dispose(); result = true; } this.m_dicAssetResoure.Remove(key); } } bool flag = false; List <string> list2 = new List <string>(); foreach (var current2 in this.m_dicAssetCollectDepResource) { if (0 >= current2.Value.RefCount) { if (!flag) { list2.Add(current2.Key); flag = true; } else { if (current2.Value.GetRemoveQuickly()) { list2.Add(current2.Key); } } } } for (int j = 0; j < list2.Count; j++) { string key2 = list2[j]; LocalAssetCollectDepResource assetCollectDepResource = null; if (this.m_dicAssetCollectDepResource.TryGetValue(key2, out assetCollectDepResource)) { if (assetCollectDepResource != null) { Debug.Log("Unload:" + assetCollectDepResource.URL); assetCollectDepResource.Dispose(); result = true; } this.m_dicAssetCollectDepResource.Remove(key2); } } return(result); }
public void OnUpdate() { if (!this.UnLoadNotUsedResource() && this.m_allUnLoadFinishedEventHandler != null) { GC.Collect(); Resources.UnloadUnusedAssets(); Action <bool> allUnLoadFinishedEventHandler = this.m_allUnLoadFinishedEventHandler; this.m_allUnLoadFinishedEventHandler = null; allUnLoadFinishedEventHandler(true); } LinkedListNode <LocalAssetResource> next; for (LinkedListNode <LocalAssetResource> linkedListNode = this.m_linkedListAssetResourceInLoading.First; linkedListNode != null; linkedListNode = next) { next = linkedListNode.Next; LocalAssetResource value = linkedListNode.Value; if (value.IsDone)//已经加载完成 { Debug.Log(value.URL + "已经下载过了"); if (!string.IsNullOrEmpty(value.Error))//如果加载没错的话 { this.m_bLoadError = true; AssetLogger.Error(value.Error); } if (this.m_allLoadFinishedEventHandler != null) { this.m_current += value.Size; } this.m_linkedListAssetResourceInLoading.Remove(linkedListNode); value.OnLoaded(); } else //还没有加载 { if (value.Canceled)//如果已经取消就从链表中移除 { Debug.Log("取消下载:" + value.URL); this.m_linkedListAssetResourceInLoading.Remove(linkedListNode); } else { if (!value.Started) { Debug.Log(value.URL + "开始下载"); value.BeginDownload(); } } } } //如果平台是手机的话,就处理1个,不是的话处理5个 int dealCount = Application.isMobilePlatform ? 1 : 10; if (this.m_linkedListNeedToLoad.Count > 0 && this.m_linkedListAssetResourceInLoading.Count < dealCount)//保持一次处理5个asset { Debug.Log(this.m_linkedListNeedToLoad.Count); LocalAssetResource value2 = this.m_linkedListNeedToLoad.First.Value; this.m_linkedListNeedToLoad.RemoveFirst(); Debug.Log("AddLast:" + value2.URL); this.m_linkedListAssetResourceInLoading.AddLast(value2); } //如果没有加载任务了,就表示完成执行完成回调函数 if (this.m_linkedListNeedToLoad.Count == 0 && this.m_linkedListAssetResourceInLoading.Count == 0 && this.m_allLoadFinishedEventHandler != null) { Action <bool> allLoadFinishedEventHandler = this.m_allLoadFinishedEventHandler; this.m_allLoadFinishedEventHandler = null; try { allLoadFinishedEventHandler(!this.m_bLoadError); } catch (Exception e) { AssetLogger.Fatal(e.ToString()); } this.m_total = 0; this.m_current = 0; } }