Пример #1
0
        IEnumerator CoLoadBundleAsync <T>(string assetName, string bundleName, E_LoadAsset eloadAsset, System.Action <T> callback)
            where T : IAssetGetter, new()
        {
            AssetBundle              bundle       = null;
            BundleHolder             bundleHolder = null;
            AssetBundleCreateRequest bundleRequest;
            // 没有加载过bundle
            string bundlePath;

            if (!bundleHolders.TryGetValue(bundleName, out bundleHolder))
            {
                bundlePath = GetBundlePath(bundleName);
                //bundleRequest = AssetBundle.LoadFromFileAsync(Path.Combine(bundleRootPath, bundleName));
                bundleRequest = AssetBundle.LoadFromFileAsync(bundlePath);
                while (!bundleRequest.isDone)
                {
                    yield return(bundleRequest);
                }

                //存bundleHolder
                bundle       = bundleRequest.assetBundle;
                bundleHolder = new BundleHolder(bundle);
                bundleHolder.AddRefence(assetName);
                //Debug.LogError(Time.realtimeSinceStartup + " " + bundleName + " " + assetName);
                bundleHolders.Add(bundleName, bundleHolder);
            }
            else
            {
                bundleHolder.AddRefence(assetName);
                bundle = bundleHolder.Get();
            }

            // 加载依赖的bundle
            string[] dependencies = manifest.GetAllDependencies(bundleName);
            for (int i = 0, iMax = dependencies.Length; i < iMax; ++i)
            {
                BundleHolder dependBundleHolder = null;
                if (bundleHolders.TryGetValue(dependencies[i], out dependBundleHolder))
                {
                    //已经存在的bundle只增加引用
                    dependBundleHolder.AddRefence(assetName);
                    continue;
                }
                //没加载过的
                AssetBundle dependBundle = null;
                bundlePath    = GetBundlePath(dependencies[i]);
                bundleRequest = AssetBundle.LoadFromFileAsync(bundlePath);
                while (!bundleRequest.isDone)
                {
                    yield return(bundleRequest);
                }
                dependBundle       = bundleRequest.assetBundle;
                dependBundleHolder = new BundleHolder(dependBundle);
                dependBundleHolder.AddRefence(assetName);
                //存bundleHolder
                bundleHolders.Add(dependencies[i], dependBundleHolder);
            }

            yield return(CoLoadAssetAsync <T>(bundle, assetName, eloadAsset, callback));
        }
Пример #2
0
        AssetBundle LoadBundle(string assetName, string bundleName)
        {
            AssetBundle  bundle       = null;
            BundleHolder bundleHolder = null;
            // 没有加载过bundle
            string bundlePath = GetBundlePath(bundleName);

            if (!bundleHolders.TryGetValue(bundleName, out bundleHolder))
            {
                //Debug.LogError("LoadFromFile [" + bundlePath + "]");
                bundle = AssetBundle.LoadFromFile(bundlePath);
                //存bundleHolder
                bundleHolder = new BundleHolder(bundle);
                bundleHolder.AddRefence(assetName);
                bundleHolders.Add(bundleName, bundleHolder);
            }
            else
            {
                bundleHolder.AddRefence(assetName);
                bundle = bundleHolder.Get();
            }

            // 加载依赖的bundle
            string [] dependencies = manifest.GetAllDependencies(bundleName);
            for (int i = 0, iMax = dependencies.Length; i < iMax; ++i)
            {
                BundleHolder dependBundleHolder = null;
                if (bundleHolders.TryGetValue(dependencies[i], out dependBundleHolder))
                {
                    //已经存在的bundle只增加引用
                    dependBundleHolder.AddRefence(assetName);
                    continue;
                }
                //没加载过的
                bundlePath = GetBundlePath(dependencies[i]);
                //AssetBundle dependBundle = AssetBundle.LoadFromFile(Path.Combine(bundleRootPath, dependencies[i]));
                AssetBundle dependBundle = AssetBundle.LoadFromFile(bundlePath);
                dependBundleHolder = new BundleHolder(dependBundle);
                dependBundleHolder.AddRefence(assetName);
                //存bundleHolder
                bundleHolders.Add(dependencies[i], dependBundleHolder);
            }

            return(bundle);
        }
Пример #3
0
        /// <summary>
        /// 释放接口,释放所有未被引用的资源。
        /// 1.把go中,所有资源Holder可以释放的情况下,移除go(销毁go时会释放,但是释放资源时不会,所以这里要统一处理)
        /// 2.把引用计数为0的资源引用取出。本类的DestroyXX减少资源引用计数。
        /// 3.然后看看是否能把对应的bundle能释放
        /// </summary>
        public void RealseAllUnUse()
        {
            unUseGameObject.Clear();
            bool could = true;

            foreach (var kv in goAssetHolders)
            {
                could = true;
                HashSet <AssetHolder> assetholders = kv.Value;
                foreach (var item in assetholders)
                {
                    if (!item.CouldRealse())
                    {
                        could = false;
                        break;
                    }
                }
                if (could)
                {
                    unUseGameObject.Add(kv.Key);
                }
            }

            for (int i = 0, iMax = unUseGameObject.Count; i < iMax; ++i)
            {
                goAssetHolders[unUseGameObject[i]].Clear();
                Debug.LogError("remove" + unUseGameObject[i].name);
                goAssetHolders.Remove(unUseGameObject[i]);
            }

            unUseAssets.Clear();
            foreach (var kv in nameAssetHolders)
            {
                if (kv.Value.CouldRealse())
                {
                    unUseAssets.Add(kv.Key);
                }
            }

            for (int i = 0, iMax = unUseAssets.Count; i < iMax; ++i)
            {
                string       bundleName   = GetBundleName(unUseAssets[i]);
                BundleHolder bundleHolder = null;
                if (bundleHolders.TryGetValue(bundleName, out bundleHolder))
                {
                    bundleHolder.RemoveRefence(unUseAssets[i]);
                    if (bundleHolder.CouldRealse())
                    {
                        bundleHolder.Release();
                        bundleHolders.Remove(bundleName);
                    }
                }

                string[] dependencies = this.manifest.GetAllDependencies(bundleName);
                for (int k = 0, kMax = dependencies.Length; k < kMax; ++k)
                {
                    BundleHolder dependBundleHolder = null;
                    if (bundleHolders.TryGetValue(dependencies[k], out dependBundleHolder))
                    {
                        dependBundleHolder.RemoveRefence(unUseAssets[i]);
                        if (dependBundleHolder.CouldRealse())
                        {
                            dependBundleHolder.Release();
                            bundleHolders.Remove(dependencies[k]);
                        }
                    }
                }

                nameAssetHolders[unUseAssets[i]].Release();
                nameAssetHolders.Remove(unUseAssets[i]);
            }
        }