Exemplo n.º 1
0
    public bool CancelAsyncLoad(ResourceObject resObj)
    {
        AsyncLoadResParam asyncParam = null;

        //首先获取是否存在该异步加载资源
        if (m_LoadingAssetDict.TryGetValue(resObj.m_Crc, out asyncParam) && m_LoadAsyncResList[(int)resObj.m_LoadPriority].Contains(asyncParam))
        {
            for (int i = asyncParam.callBackList.Count - 1; i >= 0; i--)
            {
                AsyncCallBack tempCallBack = asyncParam.callBackList[i];
                //这个判断是,当有多个物体A,B都需要加载同样的资源时,如果A取消了,但是B不能取消
                if (tempCallBack != null && tempCallBack.resObj == resObj)
                {
                    tempCallBack.Reset();
                    m_AsyncCallBackPool.UnSpawn(tempCallBack);
                    asyncParam.callBackList.RemoveAt(i);
                }
            }
            //在上层遍历完,如果异步回调列表空了,则代表不再需要异步加载该资源了,因此直接清空回收
            if (asyncParam.callBackList.Count <= 0)
            {
                asyncParam.Reset();
                m_LoadAsyncResList[(int)resObj.m_LoadPriority].Remove(asyncParam);
                m_LoadingAssetDict.Remove(resObj.m_Crc);
                m_AsyncLoadResPool.UnSpawn(asyncParam);
                return(true);
            }
        }
        return(false);
    }
Exemplo n.º 2
0
    /// <summary>
    /// 取消异步加载资源
    /// </summary>
    /// <returns>true为完全取消了,false表示可能还有其他相同操作的异步在进行,并没有取消</returns>
    public bool CancleLoad(ResourceObj resObj)
    {
        AsyncLoadResParam para = null;

        if (m_LoadingAssetDic.TryGetValue(resObj.m_Crc, out para) && m_LoadingAssetList[(int)para.m_Priority].Contains(para))
        {
            for (int i = para.m_CallBackList.Count - 1; i >= 0; i--)
            {
                AsyncCallBack tempCallBack = para.m_CallBackList[i];
                if (tempCallBack != null && resObj == tempCallBack.m_ResObj)
                {
                    tempCallBack.Reset();
                    m_AsyncCallBackPool.Recycle(tempCallBack);
                    para.m_CallBackList.Remove(tempCallBack);
                }
            }
            if (para.m_CallBackList.Count <= 0)
            {
                m_LoadingAssetList[(int)para.m_Priority].Remove(para);
                para.Reset();
                m_AsyncLoadResParamPool.Recycle(para);
                m_LoadingAssetDic.Remove(resObj.m_Crc);
                return(true);
            }
        }
        return(false);
    }
Exemplo n.º 3
0
    public void AsyncLoadResource(string path, ResourceObj resObj, OnAsyncFinish dealfinish, LoadResPriority priority)
    {
        ResourceItem item = GetCacheResourceItem(resObj.m_Crc);

        if (item != null)
        {
            resObj.m_ResItem = item;
            if (dealfinish != null)
            {
                dealfinish(path, resObj, resObj.m_Param1, resObj.m_Param2, resObj.m_Param3);
            }
            return;
        }
        //判断是否在加载中
        AsyncLoadResParam para = null;

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

        //往回调列表里面加回调
        AsyncCallBack callBack = m_AsyncCallBackPool.Spwan(true);

        callBack.m_DealFinish = dealfinish;
        callBack.m_ResObj     = resObj;
        para.m_CallBackList.Add(callBack);
    }
Exemplo n.º 4
0
    /// <summary>
    /// 用于ObjectManager异步加载接口
    /// </summary>
    public void AsyncLoadResObj(string path, ResourceObject resObj, OnAsyncResFinshCallBack resLoadCallBack)
    {
        ResourceItem item = GetCacheResourceItem(resObj.m_Crc);

        if (item != null)
        {
            resObj.m_ResItem = item;
            resLoadCallBack?.Invoke(path, resObj, resObj.m_Param1, resObj.m_Param2, resObj.m_Param3);
            resLoadCallBack = null;
            return;
        }

        //判断当前要加载的资源是否已存在加载列表中,不存在,则加入加载列表
        AsyncLoadResParam param = null;

        if (!m_LoadingAssetDict.TryGetValue(resObj.m_Crc, out param) || param == null)
        {
            param            = m_AsyncLoadResPool.Spawn();
            param.m_Crc      = resObj.m_Crc;
            param.m_Path     = path;
            param.m_Priority = resObj.m_LoadPriority;
            m_LoadingAssetDict.Add(resObj.m_Crc, param);
            m_LoadAsyncResList[(int)resObj.m_LoadPriority].Add(param);
        }
        //回调列表里添加回调
        AsyncCallBack asyncCallBack = m_AsyncCallBackPool.Spawn();

        asyncCallBack.resObj           = resObj;
        asyncCallBack.resFinshCallBack = resLoadCallBack;
        param.callBackList.Add(asyncCallBack);
    }
Exemplo n.º 5
0
    //异步资源加载-----------------------------------------------------------------------------------

    /// <summary>
    /// 异步加载资源
    /// </summary>
    /// <param name="path">资源路径</param>
    /// <param name="finishCallBack">完成后回调</param>
    /// <param name="loadPriority">加载优先级</param>
    /// <param name="param1">回调参数1</param>
    /// <param name="param2">回调参数2</param>
    /// <param name="param3">回调参数3</param>
    public void AsyncLoadResource(string path, OnAsyncFinishCallBack finishCallBack, LoadPriority loadPriority, bool isSprite = false,
                                  object param1 = null, object param2 = null, object param3 = null)
    {
        uint         crc  = CRC32.GetCRC32(path);
        ResourceItem item = GetCacheResourceItem(crc);

        if (item != null)
        {
            finishCallBack?.Invoke(path, item.m_Obj, param1, param2, param3);
            return;
        }

        //判断当前要加载的资源是否已存在加载列表中,不存在,则加入加载列表
        AsyncLoadResParam param = null;

        if (!m_LoadingAssetDict.TryGetValue(crc, out param) || param == null)
        {
            param            = m_AsyncLoadResPool.Spawn();
            param.m_Crc      = crc;
            param.m_Path     = path;
            param.m_Priority = loadPriority;
            param.m_IsSprite = isSprite;
            m_LoadAsyncResList[(int)loadPriority].Add(param);
            m_LoadingAssetDict.Add(crc, param);
        }
        //回调列表里添加回调
        AsyncCallBack asyncCallBack = m_AsyncCallBackPool.Spawn();

        asyncCallBack.finishCallBack = finishCallBack;
        asyncCallBack.param1         = param1;
        asyncCallBack.param2         = param2;
        asyncCallBack.param3         = param3;
        param.callBackList.Add(asyncCallBack);
    }
Exemplo n.º 6
0
        static void Main(string[] args)
        {  /// .Net 3.5 / 4.0 only ;)
            Console.WriteLine();
            Console.ForegroundColor = ConsoleColor.DarkGray;
            Console.WriteLine("NativePayload_AsyncMEnumSystemLocalesA , Published by Damon Mohammadbagher , Mar 2021");
            Console.ForegroundColor = ConsoleColor.Gray;
            Console.WriteLine("NativePayload_AsyncMEnumSystemLocalesA Callback Functions Technique via (EnumSystemLocalesA + AsyncMethod) API");
            Console.WriteLine();
            pay = args[0];
            AsyncCallBack CsharpMethod = new AsyncCallBack(EnumSystemLocalesAExecCode);

            System.Threading.Thread.Sleep(5555);
            bool okAgain = EnumSystemLocalesA(CsharpMethod, 0x0);

            Console.ReadKey();
        }
Exemplo n.º 7
0
    /// <summary>
    /// 异步加载资源(仅仅是不需要实例化的资源,例如音频,图片等等)
    /// </summary>
    public void AsyncLoadResource(string path, OnAsyncObjFinish dealFinish, LoadResPriority priority, bool isSprite = false, object param1 = null, object param2 = null, object param3 = null, uint crc = 0)
    {
        if (crc == 0)
        {
            crc = Crc32.GetCrc32(path);
        }

        ResouceItem item = GetCacheResouceItem(crc);

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

        //判断是否在加载中
        AsyncLoadResParam para = null;

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

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

        callBack.m_DealObjFinish = dealFinish;
        callBack.m_Param1        = param1;
        callBack.m_Param2        = param2;
        callBack.m_Param3        = param3;
        para.m_CallBackList.Add(callBack);
    }
Exemplo n.º 8
0
    /// <summary>
    /// 异步加载资源,仅仅是不需要实例化的资源,例如音频,图片等等
    /// </summary>
    public void AsyncLoadResource(string path, OnAsyncObjFinish dealFinish, LoadResPriority priority, uint crc = 0, object param1 = null, object param2 = null, object param3 = null)
    {
        if (crc == 0)
        {
            crc = CRC32.GetCRC32(path);
        }
        ResourceItem item = GetCancheResourceItem(crc);

        if (item != null)
        {
            if (dealFinish != null)
            {
                dealFinish(path, item._obj, param1, param2, param3);
            }
            return;
        }
        //判断是否在加载中
        AsyncLoadResParam param = null;

        if (!_loadingAssetDic.TryGetValue(crc, out param) || param == null)
        {
            param          = _asyncLoadResParamPool.Spawn(true);
            param.crc      = crc;
            param.path     = path;
            param.priority = priority;
            _loadingAssetDic.Add(crc, param);
            _loadingAssetList[(int)priority].Add(param);
        }

        //往回调列表里面加回调
        AsyncCallBack callBack = _asyncCallBackPool.Spawn(true);

        callBack.dealFinish = dealFinish;
        callBack.param1     = param1;
        callBack.param2     = param2;
        callBack.param3     = param3;
        param.callBackList.Add(callBack);
    }
Exemplo n.º 9
0
    /// <summary>
    /// 异步加载
    /// ?一直在运行
    /// </summary>
    /// <returns></returns>
    IEnumerator AsyncLoadCor()
    {
        long lastYiledTime             = System.DateTime.Now.Ticks;
        List <AsyncCallBack> callBacks = null;
        bool hadYiled = false;

        while (true)
        {
            //上一次yield的时间
            for (int i = 0; i < (int)LoadResPriority.RES_NUM; i++)
            {
                List <AsyncLoadResParam> loadingList = m_LoadingAssetList[i];
                if (loadingList.Count <= 0)
                {
                    continue;
                }
                AsyncLoadResParam loadingItem = loadingList[0];
                loadingList.RemoveAt(0);
                callBacks = 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 = AssetBundleManager.Instance.FindResourceItem(loadingItem.m_Crc);
                }
#endif
                if (obj == null)
                {
                    item = AssetBundleManager.Instance.LoadResourceAssetBundle(loadingItem.m_Crc);
                    if (item != null && item.m_AssetBundle)
                    {
                        AssetBundleRequest abRequest = null;
                        if (loadingItem.m_Sprite)
                        {
                            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;
                        }
                        lastYiledTime = System.DateTime.Now.Ticks;
                    }
                }

                CacheResource(loadingItem.m_Path, ref item, loadingItem.m_Crc, obj, callBacks.Count);

                for (int j = 0; j < callBacks.Count; j++)
                {
                    AsyncCallBack callBack = callBacks[j];
                    if (callBack != null && callBack.m_DealFinish != null && callBack.m_ResObj != null)
                    {
                        ResourceObj tempResObj = callBack.m_ResObj;
                        tempResObj.m_ResItem = item;
                        callBack.m_DealFinish(loadingItem.m_Path, tempResObj, tempResObj.m_Param1, tempResObj.m_Param2, tempResObj.m_Param3);
                        callBack.m_DealFinish = null;
                        tempResObj            = null;
                    }

                    if (callBack != null && callBack.m_DealObjFinish != null)
                    {
                        callBack.m_DealObjFinish(loadingItem.m_Path, obj, callBack.m_Param1, callBack.m_Param2, callBack.m_Param3);
                        callBack.m_DealObjFinish = null;
                    }
                    callBack.Reset();
                    m_AsyncCallBackPool.Recycle(callBack);
                }
                obj = null;
                callBacks.Clear();
                m_LoadingAssetDic.Remove(loadingItem.m_Crc);

                loadingItem.Reset();
                m_AsyncLoadResParamPool.Recycle(loadingItem);

                if (System.DateTime.Now.Ticks - lastYiledTime > MAXLOADRESTIME)
                {
                    yield return(null);

                    lastYiledTime = System.DateTime.Now.Ticks;
                    hadYiled      = true;
                }
            }

            if (hadYiled || System.DateTime.Now.Ticks - lastYiledTime > MAXLOADRESTIME)
            {
                lastYiledTime = System.DateTime.Now.Ticks;
                yield return(null);
            }
        }
    }
Exemplo n.º 10
0
 private static extern bool EnumSystemLocalesA(AsyncCallBack ops, uint dwFlags);
Exemplo n.º 11
0
    /// <summary>
    /// 异步加载
    /// </summary>
    IEnumerator AsyncLoader()
    {
        List <AsyncCallBack> callBackList = null;
        //上一次yield的时间
        long lastYiledTime = System.DateTime.Now.Ticks;

        while (true)
        {
            bool haveYield = false;
            for (int i = 0; i < (int)LoadResPriority.RES_NUM; i++)
            {
                List <AsyncLoadResParam> loadingList = _loadingAssetList[i];
                if (loadingList.Count <= 0)
                {
                    continue;
                }
                AsyncLoadResParam loadingItem = loadingList[0];
                loadingList.RemoveAt(0);
                callBackList = loadingItem.callBackList;

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

                    item = ABMgr.Ins.FingResourceItem(loadingItem.crc);
                }
#endif
                if (obj == null)
                {
                    item = ABMgr.Ins.LoadResAssetBundle(loadingItem.crc);
                    if (item != null && item._assetBundle != null)
                    {
                        AssetBundleRequest abRequest = null;
                        if (loadingItem.isSprite)
                        {
                            abRequest = item._assetBundle.LoadAssetAsync <Sprite>(item._assetName);
                        }
                        else
                        {
                            abRequest = item._assetBundle.LoadAssetAsync(item._assetName);
                        }
                        yield return(abRequest);

                        if (abRequest.isDone)
                        {
                            obj = abRequest.asset;
                        }
                        lastYiledTime = System.DateTime.Now.Ticks;
                    }
                }

                CacheResource(loadingItem.path, ref item, loadingItem.crc, obj, callBackList.Count);

                for (int j = 0; j < callBackList.Count; j++)
                {
                    AsyncCallBack callBack = callBackList[i];
                    if (callBack != null && callBack.dealFinish != null)
                    {
                        callBack.dealFinish(loadingItem.path, obj, callBack.param1, callBack.param2, callBack.param3);
                        callBack.dealFinish = null;
                    }
                    callBack.Reset();
                    _asyncCallBackPool.Recycle(callBack);
                }

                obj = null;
                callBackList.Clear();
                _loadingAssetDic.Remove(loadingItem.crc);
                loadingItem.Reset();
                _asyncLoadResParamPool.Recycle(loadingItem);

                if (System.DateTime.Now.Ticks - lastYiledTime > MAX_LOAD_RES_TIME)
                {
                    yield return(null);

                    lastYiledTime = System.DateTime.Now.Ticks;
                    haveYield     = true;
                }
            }
            if (!haveYield || System.DateTime.Now.Ticks - lastYiledTime > MAX_LOAD_RES_TIME)
            {
                lastYiledTime = System.DateTime.Now.Ticks;
                yield return(null);
            }
        }
    }
 private static extern bool EnumDisplayMonitors(IntPtr hdc, IntPtr lprcClip, AsyncCallBack ops, uint dwData);
 private static extern bool EnumUILanguagesA(AsyncCallBack ops, uint dwFlags, IntPtr lParam);