예제 #1
0
            private LoadTask CreatTaskAndStart(string _key, BaseBundle _bundle, System.Action <string, object> _callback, bool _retain)
            {
                LoadTask ret = new LoadTask(_key, _bundle, _callback, _retain);

                mBundleTaskList.Add(ret);
                return(ret);
            }
예제 #2
0
    private IEnumerator runTask(LoadTask task)
    {
        task._taskStartTime = Time.time;
        yield return(StartCoroutine(task.coroutine));

        task.isDone = true;
    }
 //todo
 internal void Release(string resPath, bool isUnloadAB = false)
 {
     if (!AppConst.s_IsUseAB)
     {
         return;
     }
     if (string.IsNullOrEmpty(resPath))
     {
         return;
     }
     if (isUnloadAB && loadedResource.ContainsKey(resPath))
     {
         LoadTask task = loadedResource[resPath];
         task.Unload(true);
         loadedResource.Remove(resPath);
         string[] dependence = _manifest.GetAllDependencies(resPath);
         for (int i = 0; i < dependence.Length; ++i)
         {
             if (loadedResource.ContainsKey(dependence[i]))
             {
                 loadedResource[dependence[i]].Unload(false);
                 loadedResource.Remove(dependence[i]);
             }
         }
     }
 }
    // 特殊的接口,比如加载
    void  PushLoadTask(long nAwaitPtr, long nRetPtr, string szAssetName, float fWaitTime)
    {
        ScriptInfo info = new ScriptInfo();

        info.nPtr       = nAwaitPtr;
        info.nReturnPtr = nRetPtr;

        for (int i = 0; i < m_AwaitTask.Count; ++i)
        {
            if (m_AwaitTask[i].szAssetName == szAssetName)
            {
                m_AwaitTask[i].AwaitPtr.Add(info);
                return;
            }
        }
        LoadTask rTask = new LoadTask();

        rTask.fStartTime  = Time.time;
        rTask.fWaitTime   = fWaitTime;
        rTask.szAssetName = szAssetName;
        rTask.AwaitPtr    = new List <ScriptInfo>();
        rTask.AwaitPtr.Add(info);

        m_AwaitTask.Add(rTask);
    }
예제 #5
0
 /// <summary>
 /// 移除加载任务
 /// </summary>
 /// <param name="abPath"></param>
 /// <param name="abcr"></param>
 static public void RemoveGlobalLoadTask(LoadTask loadTask)
 {
     if (loadTask.IsDone)
     {
         GLOBAL_LOAD_TASK_MAP.Remove(loadTask.LocalPath);
     }
 }
예제 #6
0
        //public void Init()
        //{
        //    ResourceLoadParam param = new ResourceLoadParam();
        //    string fileName = Helper.GetFileNameFromFullPath(GAMEOBJPOOL_CONFIG_FILEPATH);
        //    param.keyID = GAMEOBJPOOL_CONFIG_FILEPATH;
        //    param.name = fileName;
        //    ResourceManager.GetSingleton().LoadAssetBundle(GAMEOBJPOOL_CONFIG_FILEPATH, fileName, typeof(TextAsset), OnLoadConfigCallback, param);
        //}

        /// <summary>
        /// 加载/获得 某个对象物体
        /// </summary>
        /// <param name="varTask"></param>
        public void LoadObj(LoadTask varTask)
        {
            if (varTask == null)
            {
                Helper.LogError("GameObjPool LoadObj:Error caused by null LoadTask instance");
                return;
            }
            if (varTask.mType == typeof(Texture) || varTask.mType == typeof(Texture2D) || varTask.mType == typeof(Texture3D))
            {
                varTask.mObjFlag = ObjFlag.UseOriObj;
            }
            if (string.IsNullOrEmpty(varTask.mFilePath))
            {
                Helper.LogError("GameObjPool LoadObj:Error caused by null LoadTask.mFilePath");
                return;
            }
            if (IsExistObjInfo(varTask.mFilePath))
            {
                varTask.Callback(GetCacheObjInfo(varTask.mFilePath, varTask.mObjFlag));
            }
            else
            {
                if (IsInLoading(varTask.mFilePath) == false)
                {
                    TaskQueue queue = new TaskQueue(varTask.mFilePath, varTask);
                    AddTaskQueue(queue);
                    queue.Excute();
                }
                else
                {
                    AddLoadTaskToQueue(varTask);
                }
            }
        }
예제 #7
0
        public IAsyncTask LoadAssetAsync <T>(string assetPath, Action <bool, T> callback) where T : UnityEngine.Object
        {
            ResourceRequest reques = Resources.LoadAsync <T>(assetPath);
            IAsyncTask      task   = new LoadTask <T>(reques, callback);

            return(task);
        }
예제 #8
0
 //
 public static void NotifyTaskFinish(LoadTask t)
 {
     if (t != null)
     {
         g_LoadTask.Remove(t);
     }
     StartRunTask();
 }
예제 #9
0
        public LoadManager()
        {
            m_LoadTask = new LoadTask();

            if (ConstantData.enableAssetBundle)
            {
            }
        }
예제 #10
0
 private void init(string bundle_url, string asset_name, Action<UnityEngine.Object> cbk)
 {
     LoadTask load_task = new LoadTask ();
     load_task.bundleUrl = bundle_url;
     load_task.assetName = asset_name;
     load_task.successCbk = cbk;
     _load_tasks.Add (load_task);
 }
예제 #11
0
        /// <summary>
        /// send load task to load task actor
        /// </summary>
        /// <param name="message"></param>
        /// <remarks>in the future, this may be enhanced with a start
        /// location, so that it might not only have to be a full farm reload
        /// </remarks>
        public void Handle(LoadTask message)
        {
            IActorRef newTaskActor =
                ActorSystemReference.ActorSystem.ActorOf(LoadTaskActor.Props(eventAggregator, repository,
                                                                             message.Title, message.Id, message.StartLocation), message.Id.ToString());

            taskActors.Add(message.Id, newTaskActor);
        }
예제 #12
0
        /// <summary>
        /// 加载AssetBundle文件
        /// </summary>
        /// <param name="assetbundleFileName">ab文件名</param>
        /// <returns></returns>
        public void LoadAssetBundle(string assetbundleFileName, int offset = 0)
        {
            AssetBundleWapper abw = GetAssetBundleFromCache(assetbundleFileName);

            if (abw == null)
            {
                //取消加载任务
                this.CancelUnloadTask(assetbundleFileName);
                //寻找加载路径
                var abLocalPath = FindMultiAddressAsset(assetbundleFileName);
#if UNITY_EDITOR
                if (!File.Exists(abLocalPath))
                {
                    return;
                }
#endif

                //这里需要判断task列表,异步转同步
                var loadTask = GetExsitLoadTask(abLocalPath);
                if (loadTask != null)
                {
                    if (loadTask.IsAsyncTask)
                    {
                        loadTask.ToSynchronizationTask();
                        BDebug.Log("【AssetbundleV2】异步转同步:" + loadTask.LocalPath);
                    }
                    else
                    {
                        BDebug.LogError("【AssetbundleV2】同步任务调度错误~");
                    }
                }
                else
                {
                    //同步也要创建任务
                    loadTask = new LoadTask(abLocalPath, 0u, (ulong)offset);
                    AddGlobalLoadTask(loadTask);
                    {
                        //同步加载
                        loadTask.Load();
                    }
                    RemoveGlobalLoadTask(loadTask);
                }


#if UNITY_EDITOR
                if (loadTask.AssetBundle == null)
                {
                    Debug.LogError($"【AssetBundleV2】 ab加载失败{loadTask.LocalPath}");
                }
#endif
                //添加
                abw = this.AddAssetBundleToCache(assetbundleFileName, loadTask.AssetBundle);
            }

            //使用
            abw.Use();
        }
예제 #13
0
        /// <summary>
        /// Add a task to load
        /// </summary>
        /// <param name="task"></param>
        public static void AddTask(LoadTask task)
        {
            if (Tasks == null)
            {
                Tasks = new List <LoadTask>();
            }

            Tasks.Add(task);
        }
예제 #14
0
        static void Initialize()
        {
            _characterList = new List <CharacterData>();
            _characters    = new Dictionary <uint, CharacterData>();
            _scenes        = new List <SceneData>();

            AssetBundleManager.AddHandler <CharacterData>(AddCharacter);
            AssetBundleManager.AddHandler <SceneData>(AddScene);

            Characters = new ReadOnlyCollection <CharacterData>(_characterList);
            Scenes     = new ReadOnlyCollection <SceneData>(_scenes);

            SceneManager.sceneLoaded += SceneLoad;

            var bundlePath = BundleUtility.StoragePath;

            log.Info("Storage Path: {0}", bundlePath);

#if UNITY_EDITOR
            if (AssetBundleManager.SimulateAssetBundleInEditor)
            {
                LoadFromEditor <CharacterData>(AddCharacter);
                LoadFromEditor <SceneData>(AddScene);
                LoadTask.Resolve();
            }
            else
#endif
            {
                var dataFilePath = Path.Combine(bundlePath, "data");
                if (!File.Exists(dataFilePath))
                {
                    log.Info("Cannot find {0} copying StreamingAssets...", dataFilePath, bundlePath);
                    AssetBundleManager.CopyDirectory(Application.streamingAssetsPath, bundlePath);
                }

                var file      = File.ReadAllText(dataFilePath);
                var whitelist = new List <string>();
                var blacklist = new List <string>();
                foreach (var entry in file.Split('\n'))
                {
                    if (entry.StartsWith("-"))
                    {
                        blacklist.Add(entry.Substring(1).Trim());
                        log.Info("Registered bundle blacklist: {0}".With(entry.Substring(1).Trim()));
                    }
                    else
                    {
                        whitelist.Add(entry.Trim());
                        log.Info("Registered bundle whitelist: {0}".With(entry.Trim()));
                    }
                }

                var task = AssetBundleManager.LoadLocalBundles(whitelist, blacklist);
                task.Then(() => LoadTask.Resolve());
                task.Done();
            }
        }
예제 #15
0
    public void RemoveTask(string url)
    {
        LoadTask loadTask = null;

        if (_taskDictionary.TryGetValue(url, out loadTask))
        {
            RemoveTask(loadTask);
        }
    }
예제 #16
0
    private void init(string bundle_url, string asset_name, Action <UnityEngine.Object> cbk)
    {
        LoadTask load_task = new LoadTask();

        load_task.bundleUrl  = bundle_url;
        load_task.assetName  = asset_name;
        load_task.successCbk = cbk;
        _load_tasks.Add(load_task);
    }
예제 #17
0
    private void addLoad(string resName, string resPath, Action <string> callBack)
    {
        LoadTask task = new LoadTask(resName, resPath);

        loadMap.Add(resName, task);
        task.addHandler(onLoadFinish);
        task.addHandler(callBack);
        LoadThread.Instance.StartCoroutine(task.doLoad());
    }
예제 #18
0
    public LoadTask addTask(float weight, string name = null)
    {
        var task = new LoadTask();

        task.name   = name;
        task.weight = weight;
        waitingTasks.Add(task);
        return(task);
    }
예제 #19
0
    private static void StartLoad(LoadTask task)
    {
        string abName = task.abName;

        //先加载依赖AB
        string[] dependenciesAB = _manifest.GetAllDependencies(abName);
        foreach (string dpdAB in dependenciesAB)
        {
            if (_abDic.ContainsKey(dpdAB))
            {
                continue;
            }
            task.dependencies.Add(dpdAB);
            if (_loadingABCountDic.ContainsKey(dpdAB))
            {
                _loadingABCountDic[dpdAB]++;
                continue;
            }
            _loadingABCountDic.Add(dpdAB, 1);
            string relativePath = AssetPathUtil.PlatformString + "/" + dpdAB;
            string dpdUrl;
            if (VersionManager.HasCache(relativePath))
            {
                dpdUrl = VersionManager.GetPath(relativePath);
            }
            else
            {
                dpdUrl = AssetPathUtil.GetAssetBundlePath(dpdAB);
            }
            LoaderManager.Load(dpdUrl, EnumResouceType.ASSETBUNDLE, OnABLoadComplete);
        }


        if (task.IsDependenciesLoadComplete())
        {
            if (!_loadingABCountDic.ContainsKey(abName))
            {
                _loadingABCountDic.Add(abName, 1);
                string relativePath = AssetPathUtil.PlatformString + "/" + abName;
                string abUrl;
                if (VersionManager.HasCache(relativePath))
                {
                    abUrl = VersionManager.GetPath(relativePath);
                }
                else
                {
                    abUrl = AssetPathUtil.GetAssetBundlePath(abName);
                }
                LoaderManager.Load(abUrl, EnumResouceType.ASSETBUNDLE, OnABLoadComplete);
            }
            else
            {
                _loadingABCountDic[task.abName]++;
            }
        }
    }
예제 #20
0
        protected override void Dispose(bool isDisposing)
        {
            base.Dispose(isDisposing);

            if (isDisposing)
            {
                // if the player never got pushed, we should explicitly dispose it.
                DisposalTask = LoadTask?.ContinueWith(_ => player?.Dispose());
            }
        }
예제 #21
0
        /// <summary>
        /// 锁住加载AB
        /// </summary>
        static public void AddGlobalLoadTask(LoadTask loadTask)
        {
            if (GLOBAL_LOAD_TASK_MAP.ContainsKey(loadTask.LocalPath))
            {
                BDebug.LogError("【AssetbundleV2】 重复任务 " + loadTask.LocalPath);
                return;
            }

            GLOBAL_LOAD_TASK_MAP[loadTask.LocalPath] = loadTask;
        }
예제 #22
0
    /// <summary>
    /// 增加加载队列
    /// </summary>
    /// <param name="assets"></param>
    public override void AddResTask(List <string> assets, string callBackEvent)
    {
        LoadTask loadTask = new LoadTask();

        loadTask.list          = assets;
        loadTask.callBackEvent = callBackEvent;
        if (!mDownLoadQueue.Contains(loadTask))
        {
            mDownLoadQueue.Add(loadTask);
        }
    }
    private void OnTaskComplete(AsyncOperation async)
    {
        loadingTask.aysncOpertation.completed -= OnTaskComplete;
        if (async != loadingTask.aysncOpertation)
        {
            return;
        }

        //AssetBundle加载
        if (async is AssetBundleCreateRequest)
        {
            AssetBundleCreateRequest request = (AssetBundleCreateRequest)async;
            if (request.assetBundle == null)
            {
                FileLog.LogError("<" + loadingTask.relativePath + "> 不存在于目录:" + loadingTask.resPath);
                loadingTask.resource = null;
            }
            else
            {
                loadingTask.resource = request.assetBundle.LoadAsset(loadingTask.resName);
                if (!loadedResource.ContainsKey(loadingTask.resPath))
                {
                    loadedResource[loadingTask.resPath] = loadingTask;
                }
            }
        }
        else if (async is ResourceRequest)//Resource下直接加载
        {
            // FileLog.Log("资源:" + loadingTask.resName + "加载耗时:" + (Time.fixedTime - loadingTask.startTime));
            if (async == loadingTask.aysncOpertation)
            {
                object obj = ((ResourceRequest)async).asset;
                if (obj is Texture2D)
                {
                    Texture2D tex = (Texture2D)obj;
                    Sprite    sp  = Sprite.Create(tex, new Rect(0, 0, tex.width, tex.height), Vector2.zero);
                    loadingTask.resource = sp;
                }
                else
                {
                    loadingTask.resource = obj;
                }
                if (!loadedResource.ContainsKey(loadingTask.resPath))
                {
                    loadedResource[loadingTask.resPath] = loadingTask;
                }
            }
        }

        loadingTask.completeCallback?.Invoke(loadingTask.resource);
        loadingTask = null;

        StartLoadTask();
    }
예제 #24
0
 private bool isAllDependenciesReady(LoadTask task)
 {
     for (int i = 0; i < task.dependents.Length; i++)
     {
         if (!task.dependents[i].isDone)
         {
             return(false);
         }
     }
     return(true);
 }
예제 #25
0
 // Update is called once per frame
 void Update()
 {
     if (_loadTask != null)
     {
         CheckLoadTask(_loadTask);
         if (_loadTask.IsDone())
         {
             _loadTask = null;
         }
     }
 }
예제 #26
0
    public static void AddLoadTask(string ABRelativePath,
                                   string ObjName,
                                   System.Type type,
                                   bool IsCacheAsset,
                                   bool IsCacheAB,
                                   bool IsFreeUnUseABRes,
                                   AssetLoadHook pfun)
    {
        LoadTask info = new LoadTask(ABRelativePath, ObjName, type, IsCacheAsset, IsCacheAB, IsFreeUnUseABRes, pfun);

        AddLoadQueue(info);
    }
예제 #27
0
 public void Add(LoadTask _task)
 {
     if (!mList.Contains(_task))
     {
         _task.Parent = this;
         mList.Add(_task);
     }
     else
     {
         DLog.LogError("LoadTaskVector 重复添加. _task = " + _task.TaskKey);
     }
 }
예제 #28
0
    /// <summary>
    ///  正在运行的任务不能为相同的ab包。
    /// </summary>
    public bool EqualRunTask(LoadTask task)
    {
        if (task == null)
        {
            return(false);
        }
        if (string.Compare(this.m_ABRelativePath, task.m_ABRelativePath) == 0)
        {
            return(true);
        }

        return(false);
    }
예제 #29
0
 public TaskQueue(string varFilePath, LoadTask varTask)
 {
     mLoadTasks = new List <LoadTask>();
     if (varTask == null)
     {
         return;
     }
     mFilePath = varFilePath;
     mType     = varTask.mType;
     mObjFlag  = varTask.mObjFlag;
     mLoadTasks.Add(varTask);
     mFileName = Helper.GetFileNameFromFullPath(varFilePath);
 }
예제 #30
0
 /// <summary>
 /// 向队列中添加一个加载任务
 /// </summary>
 /// <param name="varTask"></param>
 public void AddLoadTask(LoadTask varTask)
 {
     if (mLoadTasks == null)
     {
         mLoadTasks = new List <LoadTask>();
     }
     if (mLoadTasks.Contains(varTask))
     {
         return;
     }
     mType = varTask.mType;
     mLoadTasks.Add(varTask);
 }
예제 #31
0
    /// <summary>
    /// 增加加载队列
    /// </summary>
    /// <param name="assets"></param>
    public override void AddResTask(List <string> assets, string callBackEvent)
    {
        LoadTask loadTask = new LoadTask();

        loadTask.list          = assets;
        loadTask.callBackEvent = callBackEvent;
        //Debug.LogError("AddResTask...");
        if (!mDownLoadQueue.Contains(loadTask))
        {
            //Debug.LogError(222);
            mDownLoadQueue.Add(loadTask);
        }
    }