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); }
/// <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(); }
/// <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)); }