Пример #1
0
    /// <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);
            }
        }
    }
Пример #2
0
 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);
         }
     }
 }
Пример #3
0
    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);
    }
Пример #4
0
    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);
        }
    }
Пример #5
0
    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);
    }