private void DoCompare() { updateABConfigs.Clear(); Dictionary <string, AssetBundleConfig> tmpDict = new Dictionary <string, AssetBundleConfig>(); ABFileMgr mABFileMgr = ABFileMgr.Instance; if (null != remoteConfigs) { int totalSize = remoteConfigs.Count; for (int i = 0; i < totalSize; i++) { dispatcher.AddAction(() => { progressCallback(i * 1.0f / totalSize); }); AssetBundleConfig localCfg = null; AssetBundleConfig streamCfg = null; bool isNew = false; if (localConfigDict.TryGetValue(remoteConfigs[i].ABName, out localCfg)) { if (localCfg.MD5Value.Equals(remoteConfigs[i].MD5Value)) { isNew = false; } else { isNew = true; } } else { if (streamConfigDict.TryGetValue(remoteConfigs[i].ABName, out streamCfg)) { if (streamCfg.MD5Value.Equals(remoteConfigs[i].MD5Value)) { isNew = false; if (!tmpDict.ContainsKey(remoteConfigs[i].RelativePath)) { mABFileMgr.SetABFileState(remoteConfigs[i].RelativePath, ABFileState.STREAMEXIT); } } else { isNew = true; } } else { isNew = true; } } if (isNew) { if (!tmpDict.ContainsKey(remoteConfigs[i].RelativePath)) { string relativePath = remoteConfigs[i].RelativePath; string[] dp = dps[relativePath]; for (int j = 0; j < dp.Length; j++) { if (!tmpDict.ContainsKey("/" + dp[j])) { AssetBundleConfig reTmpCfg = null; if (remoteConfigDict.TryGetValue("/" + dp[j], out reTmpCfg)) { AssetBundleConfig tmpCfg = null; if (localConfigDict.TryGetValue(reTmpCfg.ABName, out tmpCfg)) { if (!tmpCfg.MD5Value.Equals(reTmpCfg.MD5Value)) { mABFileMgr.SetABFileState(reTmpCfg.RelativePath, ABFileState.NONE); updateABConfigs.Add(reTmpCfg); tmpDict[reTmpCfg.RelativePath] = reTmpCfg; } } else { if (streamConfigDict.TryGetValue(reTmpCfg.ABName, out tmpCfg)) { if (tmpCfg.MD5Value.Equals(reTmpCfg.MD5Value)) { reTmpCfg.Build = remoteConfigs[i].Build; } } else { reTmpCfg.Build = remoteConfigs[i].Build; } mABFileMgr.SetABFileState(reTmpCfg.RelativePath, ABFileState.NONE); updateABConfigs.Add(reTmpCfg); tmpDict[reTmpCfg.RelativePath] = reTmpCfg; } } } else { AssetBundleConfig reTmpCfg = tmpDict["/" + dp[j]]; if (reTmpCfg.Build > remoteConfigs[i].Build) { reTmpCfg.Build = remoteConfigs[i].Build; } } } updateABConfigs.Add(remoteConfigs[i]); tmpDict[remoteConfigs[i].RelativePath] = remoteConfigs[i]; } else { AssetBundleConfig reTmpCfg = tmpDict[remoteConfigs[i].RelativePath]; if (reTmpCfg.Build > remoteConfigs[i].Build) { reTmpCfg.Build = remoteConfigs[i].Build; } } } } } dispatcher.AddAction(finishCallback); }
/// <summary> /// Step 4:对比本地和服务器配置数据信息 /// </summary> /// <param name="remoteVersionPath"></param> private void CompareVersion(string remoteVersionPath) { mParent.UpdateProgress("比对更新文件中", 0); string remoteABPath = Application.persistentDataPath + "/" + BundleCommon.ResVersion + "/Out/assetbundle"; AssetBundle remoteAB = null; AssetBundleManifest remoteABM = null; if (File.Exists(remoteABPath)) { remoteAB = AssetBundle.LoadFromFile(remoteABPath); } if (null != remoteAB) { remoteABM = remoteAB.LoadAsset("AssetBundleManifest") as AssetBundleManifest; remoteAB.Unload(false); } remoteConfigs = XMLTool.LoadAllABConfig(remoteVersionPath); localConfigs = XMLTool.LoadAllABConfig(BundleCommon.UserVersionPath); streamConfigs = XMLTool.LoadAllABConfig(BundleCommon.StreamUserVersionPath, true); updateABConfigs = new List <AssetBundleConfig>(); if (null != remoteConfigs) { Dictionary <string, AssetBundleConfig> localConfigDict = new Dictionary <string, AssetBundleConfig>(); Dictionary <string, AssetBundleConfig> remoteConfigDict = new Dictionary <string, AssetBundleConfig>(); Dictionary <string, AssetBundleConfig> streamConfigDict = new Dictionary <string, AssetBundleConfig>(); Dictionary <string, string[]> dps = new Dictionary <string, string[]>(); for (int i = 0; i < remoteConfigs.Count; i++) { remoteConfigDict[remoteConfigs[i].RelativePath] = remoteConfigs[i]; mABFileMgr.AddABFile(remoteConfigs[i]); } for (int i = 0; i < localConfigs.Count; i++) { localConfigDict[localConfigs[i].ABName] = localConfigs[i]; } if (null != streamConfigs) { for (int i = 0; i < streamConfigs.Count; i++) { streamConfigDict[streamConfigs[i].ABName] = streamConfigs[i]; } } int totalSize = remoteConfigs.Count; for (int i = 0; i < totalSize; i++) { AssetBundleConfig localCfg = null; AssetBundleConfig streamCfg = null; bool isNew = false; if (localConfigDict.TryGetValue(remoteConfigs[i].ABName, out localCfg)) { if (localCfg.MD5Value.Equals(remoteConfigs[i].MD5Value)) { isNew = false; mABFileMgr.SetABFileState(remoteConfigs[i].RelativePath, ABFileState.DOWNLOADED); } else { isNew = true; } } else { if (streamConfigDict.TryGetValue(remoteConfigs[i].ABName, out streamCfg)) { if (streamCfg.MD5Value.Equals(remoteConfigs[i].MD5Value)) { isNew = false; mABFileMgr.SetABFileState(remoteConfigs[i].RelativePath, ABFileState.STREAMEXIT); } else { isNew = true; } } else { isNew = true; } } if (isNew) { string relativePath = remoteConfigs[i].RelativePath; string[] dp = remoteABM.GetAllDependencies(relativePath.Substring(1, relativePath.Length - 1)); dps[relativePath] = dp; } } if (dps.Count > 0) { CompareThread.StartCompare(remoteConfigs, remoteConfigDict, localConfigDict, streamConfigDict, dps, updateABConfigs, CompareProgress, CompareFinish); } else { CompareFinish(); } } else { CompareFinish(); } }