コード例 #1
0
        /// <summary>
        /// 写入下载缓存信息用于断点续传
        /// </summary>
        void SaveDownloadCacheData()
        {
            if (currentState < State.UpdateAssetBundle)
            {
                return;
            }
            if (!Directory.Exists(PathResolver.CACHE_PATH))
            {
                return;
            }
            var manifestPath = PathResolver.GetCacheFileFullName(PathResolver.MAIN_MANIFEST_FILE_NAME);
            var manifestFile = PathResolver.LoadMainManifestByPath(manifestPath);

            if (null == manifestFile)
            {
                return;
            }
            //加载缓存信息文件
            var cache = new DownloadCache();

            cache.Load(PathResolver.DOWNLOADCACHE_FILE_PATH);
            //获取下载器完成任务列表
            if (m_Downloader != null && m_Downloader.completeDownloads != null && m_Downloader.completeDownloads.Count > 0)
            {
                foreach (var name in m_Downloader.completeDownloads)
                {
                    var hashCode = manifestFile.GetAssetBundleHash(name);
                    if (hashCode.isValid && !cache.data.assetBundles.ContainsKey(name))
                    {
                        var elem = new DownloadCacheData.AssetBundle()
                        {
                            assetbundleName = name, hash = hashCode.ToString()
                        };
                        Debug.Log(cache.data.assetBundles.Count + " - Cache Add:" + name);
                        cache.data.assetBundles.Add(name, elem);
                    }
                }
            }

            if (!cache.IsEmpty())
            {
                cache.Save(PathResolver.DOWNLOADCACHE_FILE_PATH);
            }
        }
コード例 #2
0
        void CompareAsset(
            ref List <string> downFiles,
            ref List <string> deleteFiles,
            AssetBundleManifest oldManifest,
            AssetBundleManifest newManifest,
            ResourcesManifest oldResManifest,
            ResourcesManifest newResManifest)
        {
            if (downFiles != null)
            {
                downFiles.Clear();
            }
            if (deleteFiles != null)
            {
                deleteFiles.Clear();
            }
            if (oldManifest == null)
            {
                Error(ErrorCode.LoadMainManifestFailed, "Local Manifest no Find");
                return;
            }
            if (newManifest == null)
            {
                Error(ErrorCode.LoadNewMainManifestFailed, "Load New MainManifest no Find");
                return;
            }
            if (newResManifest == null)
            {
                Error(ErrorCode.loadNewResourcesManiFestFailed, "Load New ResourceManifest no Find");
                return;
            }
            //标记位
            var old_ver_bit        = 1 << 0; //存在旧资源
            var new_ver_bit        = 1 << 1; //存在新资源
            var old_ver_native_bit = 1 << 2; //存在旧的本地资源
            var new_ver_native_bit = 1 << 3; //存在新的本地资源

            var tempDic = new Dictionary <string, int>();
            //标记旧资源
            var allAssetBundle = oldManifest.GetAllAssetBundles();

            foreach (var name in allAssetBundle)
            {
                SetDictionaryBit(ref tempDic, name, old_ver_bit);
            }
            //标记新资源
            var allNewAssetBundle = newManifest.GetAllAssetBundles();

            foreach (var name in allNewAssetBundle)
            {
                SetDictionaryBit(ref tempDic, name, new_ver_bit);
            }
            //标记旧本地资源
            if (oldResManifest.data != null && oldResManifest.data.assetbundles != null)
            {
                var itor = oldResManifest.data.assetbundles.GetEnumerator();
                while (itor.MoveNext())
                {
                    if (itor.Current.Value.isNative)
                    {
                        var name = itor.Current.Value.assetBundleName;
                        SetDictionaryBit(ref tempDic, name, old_ver_native_bit);
                    }
                }
            }
            //标记新的本地资源
            if (newResManifest.data != null && newResManifest.data.assetbundles != null)
            {
                var itor = newResManifest.data.assetbundles.GetEnumerator();
                while (itor.MoveNext())
                {
                    if (itor.Current.Value.isNative)
                    {
                        var name = itor.Current.Value.assetBundleName;
                        SetDictionaryBit(ref tempDic, name, new_ver_native_bit);
                    }
                }
            }

            //优先级:both>add>delete
            //both: 第0位和第1位标记的
            //delete : 第0位标记
            //add:第2位未标记,第3位标记的
            int both      = old_ver_bit | new_ver_bit;//2个版本都存在的资源
            var addFiles  = new List <string>();
            var bothFiles = new List <string>();

            using (var itor = tempDic.GetEnumerator())
            {
                while (itor.MoveNext())
                {
                    var name = itor.Current.Key;
                    var mask = itor.Current.Value;
                    if ((mask & new_ver_native_bit) == new_ver_native_bit &&
                        (mask & old_ver_native_bit) == 0)
                    {
                        addFiles.Add(name);
                    }
                    else if ((mask & both) == both)
                    {
                        bothFiles.Add(name);
                    }
                    else if ((mask & old_ver_bit) == old_ver_bit)
                    {
                        deleteFiles.Add(name);
                    }
                }
                itor.Dispose();
            }

            //加载下载缓存数据
            var download = new DownloadCache();

            download.Load(PathResolver.DOWNLOADCACHE_FILE_PATH);
            if (download.IsEmpty())
            {
                download = null;
            }

            //记录需要下载的文件
            {
                //加入新增文件
                downFiles.AddRange(addFiles);
                //判断同时存在文件的哈希
                foreach (var name in bothFiles)
                {
                    var fullName = PathResolver.GetFileFullName(name);
                    if (File.Exists(fullName))
                    {
                        //判断哈希是否相同
                        var oldHash = oldManifest.GetAssetBundleHash(name).ToString();
                        var newHash = newManifest.GetAssetBundleHash(name).ToString();
                        if (oldHash.CompareTo(newHash) == 0)
                        {
                            continue;
                        }
                        downFiles.Add(name);
                    }
                }

                //过滤已下载的文件
                if (null != download)
                {
                    var itor = download.data.assetBundles.GetEnumerator();
                    while (itor.MoveNext())
                    {
                        var elem     = itor.Current.Value;
                        var name     = elem.assetbundleName;
                        var fullName = PathResolver.GetFileFullName(name);
                        if (File.Exists(fullName))
                        {
                            var cacheHash = elem.hash;
                            var newHash   = newManifest.GetAssetBundleHash(name).ToString();
                            if (!string.IsNullOrEmpty(cacheHash) && cacheHash.CompareTo(newHash) == 0)
                            {
                                downFiles.Remove(name);
                            }
                        }
                    }
                }
            }
        }