/// <summary> /// 把资源列表加入指定块中,并且返回需下载的资源列表. /// 保证如果存在块中,这个资源必然已经加载或者正在加载中. /// </summary> /// <param name="chunk">Chunk.</param> /// <param name="resArray">过滤后需要下载的列表</param> private void PushResources(ResourcesChunkData chunkData, ref List <string> resArray) { for (int i = resArray.Count - 1; i >= 0; i--) { if (!chunkData.resHash.Contains(resArray[i])) { int deleteIndex; // 如果有缓存不用加入 if (mCacheData.ContainsKey(resArray[i])) { mCacheData[resArray[i]].AddReference(); chunkData.resHash.Add(resArray[i]); resArray.RemoveAt(i); } else if (FindInDelete(resArray[i], out deleteIndex)) { ResourcesData data = ActivateDeleteCache(deleteIndex); data.AddReference(); mCacheData.Add(data.Name, data); chunkData.resHash.Add(resArray[i]); resArray.RemoveAt(i); } else { mCacheData.Add(resArray[i], new ResourcesData(resArray[i])); chunkData.resHash.Add(resArray[i]); } } else { resArray.RemoveAt(i); } } }
private void FilterChunk(ResourcesChunkData chunkData, ref List <string> resArray) { for (int i = resArray.Count - 1; i >= 0; i--) { if (chunkData.resHash.Contains(resArray[i])) { resArray.RemoveAt(i); } } }
private void CreateLoadTask(ResourcesChunkData chunkData, List <string> resList, System.Action call) { MultiForWww multi = new MultiForWww { Data = call, OnAllCompleted = OnMultiCompleted, OnSubCompleted = OnLoadCompleted }; multi.Start(resList); mLoadTask.Add(multi); }
public void Unload(string chunkName) { ResourcesChunkData chunkData = null; if (mChunkData.TryGetValue(chunkName, out chunkData)) { foreach (string iter in chunkData.resHash) { ResourcesData resData; if (mCacheData.TryGetValue(iter, out resData)) { mCacheData[iter].LessenReference(); } } mChunkData.Remove(chunkName); } }
public void Load(string[] resArray, string chunk, System.Action call) { #if USE_5_BUNDLE for (int i = 0; i < resArray.Length; i++) { resArray[i] = resArray[i].ToLower(); } #endif // 1. 是否有相同的块 // 2. 资源是否存在缓存中 // 3. 资源是否正在加载中(存在于块中) List <string> loadArray = null; ResourcesChunkData chunkData = null; if (!ExistInChunk(chunk)) { chunkData = new ResourcesChunkData(chunk); mChunkData.Add(chunk, chunkData); } else { chunkData = mChunkData[chunk]; } // TODO: 这里可以先过滤一遍chunk // FilterChunk(,) // 获取资源列表 loadArray = GetFullLoadList(resArray); // 加入资源列表. // 1. 如果是新资源,在加载前自动加入缓存,ref = 0. // 2. 当加载成功ref自增加一 // 3. 引用为0时并且IsLoad = true,表示这个资源没有被任何块引用.可以卸载. PushResources(chunkData, ref loadArray); CreateLoadTask(chunkData, loadArray, call); }