Example #1
0
    public void AsyncLoadResource(string path, OnLoadResFinish dealFinish, LoadResPriority priority,
                                  object param1 = null, object param2 = null, object param3 = null, uint crc = 0)
    {
        if (crc == 0)
        {
            crc = Crc32.GetCrc32(path);
        }

        ResourceItem item = GetCacheResourceItem(crc);

        if (item != null)
        {
            if (dealFinish != null)
            {
                dealFinish(path, item.m_Obj, param1, param2, param3);
            }

            return;
        }
        //判断是否在加载中
        AsyncLoadResInfo para = null;

        if (!m_LoadingAssetDic.TryGetValue(crc, out para) || para == null)
        {
            para            = m_AsyncLoadResParamPool.Spawn();
            para.m_Crc      = crc;
            para.m_Path     = path;
            para.m_Priority = priority;
            m_LoadingAssetDic.Add(crc, para);
            m_LoadingAssetList[(int)priority].Add(para);
        }

        //往回调列表里面加回调
        AsyncLoadResCallBackInfo callBack = m_AsyncCallBackPool.Spawn();

        callBack.m_DealFinish = dealFinish;
        callBack.m_Param1     = param1;
        callBack.m_Param2     = param2;
        callBack.m_Param3     = param3;
        para.m_CallBackList.Add(callBack);
    }
Example #2
0
    //异步加载协程
    IEnumerator AsyncLoadCor()
    {
        //回调队列
        List <AsyncLoadResCallBackInfo> callBackList = null;

        long lastYieldTime = System.DateTime.Now.Ticks;

        while (true)
        {
            bool haveYield = false;
            //遍历需加载资源队列
            for (int i = 0; i < (int)LoadResPriority.RES_NUM; i++)
            {
                List <AsyncLoadResInfo> loadingList = m_LoadingAssetList[i];
                if (loadingList.Count <= 0)
                {
                    continue;
                }

                AsyncLoadResInfo loadingItem = loadingList[0];
                loadingList.RemoveAt(0);
                //取出回调
                callBackList = loadingItem.m_CallBackList;

                Object       obj  = null;
                ResourceItem item = null;
#if UNITY_EDITOR
                if (!m_loadFromAssetBundle)
                {
                    obj = LoadAssetByEditor <Object>(loadingItem.m_Path);
                    //模拟异步加载
                    yield return(new WaitForSeconds(0.5f));

                    item = AssetBundleMgr.Instance.GetResourceItem(loadingItem.m_Crc);
                }
#endif
                if (obj == null)
                {
                    item = AssetBundleMgr.Instance.LoadResourceAssetBundle(loadingItem.m_Crc);
                    if (item != null && item.m_AssetBundle != null)
                    {
                        AssetBundleRequest abRequest = null;
                        if (loadingItem.isSprite)
                        {
                            abRequest = item.m_AssetBundle.LoadAssetAsync <Sprite>(item.m_AssetName);
                        }
                        else
                        {
                            abRequest = item.m_AssetBundle.LoadAssetAsync(item.m_AssetName);
                        }

                        yield return(abRequest);

                        if (abRequest.isDone)
                        {
                            obj = abRequest.asset;
                        }

                        lastYieldTime = System.DateTime.Now.Ticks;
                    }
                }

                CacheResource(loadingItem.m_Path, ref item, loadingItem.m_Crc, obj, callBackList.Count);
                for (int j = 0; j < callBackList.Count; j++)
                {
                    AsyncLoadResCallBackInfo callBack = callBackList[j];
                    if (callBack != null && callBack.m_DealFinish != null)
                    {
                        callBack.m_DealFinish(loadingItem.m_Path, obj, callBack.m_Param1, callBack.m_Param2,
                                              callBack.m_Param3);//执行回调
                        callBack.m_DealFinish = null;
                    }

                    callBack.Reset();
                    m_AsyncCallBackPool.Recycle(callBack);
                }


                obj = null;
                callBackList.Clear();
                m_LoadingAssetDic.Remove(loadingItem.m_Crc);
                loadingItem.Reset();
                m_AsyncLoadResParamPool.Recycle(loadingItem);

                if (System.DateTime.Now.Ticks - lastYieldTime > MAXLOADRESTIME)//大于这个时间等待一帧
                {
                    yield return(null);

                    lastYieldTime = System.DateTime.Now.Ticks;
                    haveYield     = true;
                }
            }

            if (!haveYield || System.DateTime.Now.Ticks - lastYieldTime > MAXLOADRESTIME)//大于这个时间等待一帧
            {
                lastYieldTime = System.DateTime.Now.Ticks;
            }

            yield return(null);
        }
    }