private AbstractRes AddToLoad(ResName resName) { AbstractRes res = mResList.Find(r => r.Name.Equals(resName)); if (res != null) { return(res); } res = ResMgr.Instance.GetRes(resName, true); //无论该资源是否加载完成,都需要添加对该资源依赖的引用 ResName[] depends = res.GetDependencies(); if (depends != null) { for (int i = 0; i < depends.Length; i++) { AddToLoad(depends[i]); } } //add to list res.AddRef(); mResList.Add(res); if (res.State != eResState.Ready) { mWaitLoadList.AddLast(res); } return(res); }
private void DoLoadAsync() { var curNode = mWaitLoadList.First; while (curNode != null) { var node = curNode; curNode = curNode.Next; AbstractRes res = node.Value; //ensure the dependecies are loaded beforehand if (res.IsDependencyLoadFinish()) { mWaitLoadList.Remove(node); if (res.State != eResState.Ready) { res.RegisterListener(OnLoadAsyncFinish); res.LoadAsync(); } else { InvokeFinishCb(true, res); } } //curNode已经被Remove了,说明已经执行过一次DoLoadAsync的递归调用,直接跳出 if (curNode != null && !mWaitLoadList.Contains(curNode.Value)) { break; } } }
public static void Recycle(AbstractRes res) { switch (res.ResType) { case eResType.Assetbundle: SafeObjectPool <ABRes> .Instance.Recycle(res as ABRes); break; case eResType.Asset: SafeObjectPool <AssetRes> .Instance.Recycle(res as AssetRes); break; case eResType.Scene: SafeObjectPool <SceneRes> .Instance.Recycle(res as SceneRes); break; case eResType.Internal: SafeObjectPool <InternalRes> .Instance.Recycle(res as InternalRes); break; case eResType.SingleFile: SafeObjectPool <SingleFileRes> .Instance.Recycle(res as SingleFileRes); break; } }
/// <summary> /// Load resource synchronously /// </summary> /// <param name="name">res name with extension, e.g. "a.prefab"</param> /// <param name="abName">optional assetbundle name, in case of same naming.</param> public object LoadSync(string name, string abName = null) { AbstractRes res = AddToLoad(ResDataMgr.Instance.GetResName(name, abName)); foreach (AbstractRes loadres in mWaitLoadList) { loadres.LoadSync(); } mWaitLoadList.Clear(); return(res.Asset); }
private void InvokeFinishCb(bool success, AbstractRes res) { List <UnityAction <bool, object> > callbacks; if (mFinishCbDict.TryGetValue(res, out callbacks)) { foreach (UnityAction <bool, object> callback in callbacks) { callback(success, res.Asset); } mFinishCbDict.Remove(res); } }
private void CleanResMap(Func <AbstractRes, bool> condition) { string[] keys = mResDict.Keys.ToArray(); for (int i = 0; i < keys.Length; i++) { AbstractRes res = mResDict[keys[i]]; if (condition(res)) { if (res.ReleaseRes()) { mResDict.Remove(keys[i]); ResFactory.Recycle(res); } } } }
public void Release(string name, string abName = null) { AbstractRes res = ResMgr.Instance.GetRes(ResDataMgr.Instance.GetResName(name, abName)); if (res == null) { return; } mWaitLoadList.Remove(res); mFinishCbDict.Remove(res); if (mResList.Remove(res)) { res.SubRef(); ResMgr.Instance.SetDirty(); } }
public static AbstractRes Create(ResName name) { AbstractRes res = null; switch (name.ResType) { case eResType.Assetbundle: res = SafeObjectPool <ABRes> .Instance.Allocate(); break; case eResType.Asset: res = SafeObjectPool <AssetRes> .Instance.Allocate(); break; case eResType.Scene: res = SafeObjectPool <SceneRes> .Instance.Allocate(); break; case eResType.Internal: res = SafeObjectPool <InternalRes> .Instance.Allocate(); break; case eResType.SingleFile: res = SafeObjectPool <SingleFileRes> .Instance.Allocate(); break; } if (res == null) { throw new Exception(">>>[ResKit]: Create Res Error: " + name.FullName); } res.Init(name); return(res); }
/// <summary> /// Load resource asynchronously /// </summary> /// <param name="name">res name with extension, e.g. "a.prefab"</param> /// <param name="abName">optional assetbundle name, in case of same naming.</param> /// <param name="onFinish">on finish callback, with param: success boolean, and loaded object.</param> public void LoadAsync(string name, string abName = null, UnityAction <bool, object> onFinish = null) { AbstractRes res = AddToLoad(ResDataMgr.Instance.GetResName(name, abName)); if (res.State == eResState.Ready) { if (onFinish != null) { onFinish(true, res.Asset); } } else { if (onFinish != null) { if (!mFinishCbDict.ContainsKey(res)) { mFinishCbDict.Add(res, new List <UnityAction <bool, object> >()); } mFinishCbDict[res].Add(onFinish); } DoLoadAsync(); } }
private void OnLoadAsyncFinish(bool success, AbstractRes res) { InvokeFinishCb(success, res); res.RemoveListener(OnLoadAsyncFinish); DoLoadAsync(); }