Exemple #1
0
    public override void Update()
    {
        if (!m_Active)
        {
            return;
        }

        ///1.判断现有的是否加载完成
        if (m_LoadRequest != null)
        {
            if (m_LoadRequest.isDone)
            {
                sResLoadChunk info = m_LoadQueue[0];

                ResourceLoaderManager.Instance.AddResource(info.Path, m_LoadRequest.asset);
                info.Stage = eResChunkStage.LOADED;
                m_LoadQueue.RemoveAt(0);
                m_LoadRequest = null;
                EventController.TriggerEvent(ResourceID.RESOURCE_LOAD_PROGRESS, m_TotalCount - m_LoadQueue.Count, m_TotalCount, info.Path);

                CheckLoadComplate();
            }
        }
        ///2.加载新资源
        if (m_LoadRequest == null && m_LoadQueue.Count > 0)
        {
            ProcessLoad();
        }
        base.Update();
    }
    /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~异步加载~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
    /// <summary>
    /// 添加异步资源加载
    /// </summary>
    /// <param name="path">资源路径</param>
    /// <param name="type">资源类型</param>
    /// <param name="callback">资源成功或失败回调函数</param>
    /// 例:ResourceManager.Instance.AddAsync("Prefab/Scene/Map_1003", eResType.PREFAB, delegate(sResLoadResult info){});
    /// <returns></returns>
    public ulong AddAsync(string path, eResType type, System.Action <sResLoadResult> callback)
    {
        if (m_BackLoadThread == null || string.IsNullOrEmpty(path))
        {
            return(0);
        }

        //判断是否已经加载过
        Object res = ResourceLoaderManager.Instance.GetResource(path);

        if (res != null)
        {
            if (callback != null)
            {
                callback(new sResLoadResult(true, path));
            }
            return(0);
        }

        ulong         id   = ShareGUID();
        sResLoadChunk info = new sResLoadChunk(path, type, callback);

        info.ID = id;
        m_BackLoadThread.Add(info);
        return(id);
    }
    /// <summary>
    /// 添加到加载队列
    /// </summary>
    public virtual bool Add(sResLoadChunk info)
    {
        //Log.Info("[load]add load info:" + info.Path);
        switch (m_LoadStrategy)
        {
        case eResLoadStrategy.FIFO:
            m_LoadQueue.Add(info);
            break;

        case eResLoadStrategy.FILO:
            m_LoadQueue.Insert(0, info);
            break;

        case eResLoadStrategy.PRIORITY:
            //TODO
            m_LoadQueue.Add(info);
            break;

        default:
            m_LoadQueue.Add(info);
            break;
        }
        m_TotalCount++;
        return(true);
    }
    /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~同步加载~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
    /// <summary>
    /// 增加同步资源加载
    /// </summary>
    /// <param name="path">资源路径</param>
    /// <param name="type">资源类型</param>
    /// <returns></returns>
    public ulong AddSync(string path, eResType type)
    {
        if (m_FrontLoadThread == null || string.IsNullOrEmpty(path))
        {
            return(0);
        }

        ulong         id   = ShareGUID();
        sResLoadChunk info = new sResLoadChunk(path, type, null);

        info.ID = id;
        m_FrontLoadThread.Add(info);
        return(id);
    }
    /// <summary>
    /// 同步加载
    /// </summary>
    private void ProcessLoad()
    {
        if (m_LoadQueue.Count == 0)
        {
            return;
        }

        {//执行加载
            sResLoadChunk info = m_LoadQueue[0];
            info.Stage       = eResChunkStage.LOADING;
            m_CurLoadResPath = "";

            //先判断是否已经加载过
            Object res = ResourceLoaderManager.Instance.GetResource(info.Path);
            if (res != null)
            {
                info.Stage = eResChunkStage.LOADED;
                if (info.Callback != null)
                {
                    info.Callback(new sResLoadResult(true, info.Path));
                }

                m_LoadQueue.RemoveAt(0);
                m_TotalCount--;
            }
            else
            {
                ResourceRequest req = LoadOnce(info);
                if (req == null)
                {
                    info.Stage = eResChunkStage.LOADED;
                    if (info.Callback != null)
                    {
                        info.Callback(new sResLoadResult(false, info.Path));
                    }
                    m_LoadQueue.RemoveAt(0);
                    m_TotalCount--;
                }
                else
                {
                    m_CurLoadResPath = info.Path;
                    info.Stage       = eResChunkStage.LOADING;
                    m_LoadRequest    = req;
                }
                //Log.Debug("[load]async load res:" + info.Path);
            }
        }
    }
    /// <summary>
    /// 加载一个
    /// </summary>
    private ResourceRequest LoadOnce(sResLoadChunk info)
    {
        ResourceRequest req = null;

        switch (info.Type)
        {
        case eResType.SOUND:
            req = ResourceLoaderManager.Instance.LoadAsyncSound(info.Path);
            break;

        default:
            req = ResourceLoaderManager.Instance.LoadAsync(info.Path);
            break;
        }
        //if (GlobalID.IsLogLoad) Log.Info("[load]async end load:" + info.Path);
        return(req);
    }
Exemple #7
0
 /// <summary>
 /// 添加到加载队列
 /// </summary>
 public override bool Add(sResLoadChunk info)
 {
     if (m_Active)
     {
         Log.Error("加载队列正在执行:" + info.Path);
         return(false);
     }
     foreach (var item in m_LoadQueue)
     {
         if (item.Path == info.Path)
         {
             Log.Warning("ResourceLoadAsyncThread::Add - 相同资源已经在队列中:" + info.Path);
             break;
         }
     }
     return(base.Add(info));
 }
    public override void Update()
    {
        if (!m_Active)
        {
            return;
        }

        ///1.判断现有的是否加载完成
        if (m_LoadRequest != null)
        {
            if (m_LoadRequest.isDone)
            {
                if (m_LoadQueue.Count > 0)
                {
                    sResLoadChunk info = m_LoadQueue[0];
                    if (m_CurLoadResPath == info.Path)
                    {//如果不存在,有可能上层逻辑已经移除了正在加载的任务
                        //Log.Debug("ResourceLoadAsyncThread load complete res:" + info.Path);
                        ResourceLoaderManager.Instance.AddResource(info.Path, m_LoadRequest.asset);
                        info.Stage = eResChunkStage.LOADED;
                        if (info.Callback != null)
                        {
                            info.Callback(new sResLoadResult(true, info.Path));
                        }
                        //回调过程中,有可能清理了加载项
                        if (m_LoadQueue.Count > 0 && m_LoadQueue[0].ID == info.ID)
                        {
                            m_LoadQueue.RemoveAt(0);
                        }
                        m_TotalCount--;
                    }
                }
                m_LoadRequest = null;
            }
        }
        ///2.加载新资源
        if (m_LoadRequest == null && m_LoadQueue.Count > 0)
        {
            ProcessLoad();
        }

        base.Update();
    }
Exemple #9
0
    /// <summary>
    /// 同步加载
    /// </summary>
    private void ProcessLoad()
    {
        if (m_LoadQueue.Count == 0)
        {
            return;
        }

        {//执行加载
            sResLoadChunk info = m_LoadQueue[0];
            info.Stage = eResChunkStage.LOADING;

            //先判断是否已经加载过
            Object res = ResourceLoaderManager.Instance.GetResource(info.Path);
            if (res != null)
            {
                info.Stage = eResChunkStage.LOADED;
                m_LoadQueue.RemoveAt(0);
                EventController.TriggerEvent(ResourceID.RESOURCE_LOAD_PROGRESS, m_TotalCount - m_LoadQueue.Count, m_TotalCount, info.Path);
            }
            else
            {
                ResourceRequest req = LoadOnce(info);
                if (req == null)
                {
                    info.Stage = eResChunkStage.LOADED;
                    m_LoadQueue.RemoveAt(0);
                    EventController.TriggerEvent(ResourceID.RESOURCE_LOAD_PROGRESS, m_TotalCount - m_LoadQueue.Count, m_TotalCount, info.Path);
                }
                else
                {
                    info.Stage    = eResChunkStage.LOADING;
                    m_LoadRequest = req;
                }
                //Log.Debug("[load]sync load res:" + info.Path);
            }
        }
        CheckLoadComplate();
    }
 /// <summary>
 /// 添加到加载队列
 /// </summary>
 public override bool Add(sResLoadChunk info)
 {
     return(base.Add(info));
 }