Update patch system

优化代码逻辑结构
pull/21/head
hevinci 2022-07-07 19:10:44 +08:00
parent b238759f61
commit fb5e289de0
6 changed files with 89 additions and 87 deletions

View File

@ -382,7 +382,7 @@ namespace YooAsset
// 忽略APP资源 // 忽略APP资源
// 注意如果是APP资源并且哈希值相同则不需要下载 // 注意如果是APP资源并且哈希值相同则不需要下载
if (appPatchManifest.Bundles.TryGetValue(patchBundle.BundleName, out PatchBundle appPatchBundle)) if (appPatchManifest.TryGetPatchBundle(patchBundle.BundleName, out PatchBundle appPatchBundle))
{ {
if (appPatchBundle.IsBuildin && appPatchBundle.Hash == patchBundle.Hash) if (appPatchBundle.IsBuildin && appPatchBundle.Hash == patchBundle.Hash)
continue; continue;

View File

@ -203,7 +203,7 @@ namespace YooAsset
// 忽略APP资源 // 忽略APP资源
// 注意如果是APP资源并且哈希值相同则不需要下载 // 注意如果是APP资源并且哈希值相同则不需要下载
if (_impl.AppPatchManifest.Bundles.TryGetValue(patchBundle.BundleName, out PatchBundle appPatchBundle)) if (_impl.AppPatchManifest.TryGetPatchBundle(patchBundle.BundleName, out PatchBundle appPatchBundle))
{ {
if (appPatchBundle.IsBuildin && appPatchBundle.Hash == patchBundle.Hash) if (appPatchBundle.IsBuildin && appPatchBundle.Hash == patchBundle.Hash)
continue; continue;

View File

@ -42,13 +42,13 @@ namespace YooAsset
/// 资源包集合提供BundleName获取PatchBundle /// 资源包集合提供BundleName获取PatchBundle
/// </summary> /// </summary>
[NonSerialized] [NonSerialized]
public readonly Dictionary<string, PatchBundle> Bundles = new Dictionary<string, PatchBundle>(); public readonly Dictionary<string, PatchBundle> BundleDic = new Dictionary<string, PatchBundle>();
/// <summary> /// <summary>
/// 资源映射集合提供AssetPath获取PatchAsset /// 资源映射集合提供AssetPath获取PatchAsset
/// </summary> /// </summary>
[NonSerialized] [NonSerialized]
public readonly Dictionary<string, PatchAsset> Assets = new Dictionary<string, PatchAsset>(); public readonly Dictionary<string, PatchAsset> AssetDic = new Dictionary<string, PatchAsset>();
/// <summary> /// <summary>
/// 资源路径映射集合 /// 资源路径映射集合
@ -117,7 +117,7 @@ namespace YooAsset
/// </summary> /// </summary>
public string MappingToAssetPath(string location) public string MappingToAssetPath(string location)
{ {
if(string.IsNullOrEmpty(location)) if (string.IsNullOrEmpty(location))
{ {
YooLogger.Error("Failed to mapping location to asset path, The location is null or empty."); YooLogger.Error("Failed to mapping location to asset path, The location is null or empty.");
return string.Empty; return string.Empty;
@ -138,18 +138,18 @@ namespace YooAsset
} }
/// <summary> /// <summary>
/// 获取资源包名称 /// 获取资源包
/// 注意:传入的资源路径一定合法有效! /// 注意:传入的资源路径一定合法有效!
/// </summary> /// </summary>
public string GetBundleName(string assetPath) public PatchBundle GetMainPatchBundle(string assetPath)
{ {
if (Assets.TryGetValue(assetPath, out PatchAsset patchAsset)) if (AssetDic.TryGetValue(assetPath, out PatchAsset patchAsset))
{ {
int bundleID = patchAsset.BundleID; int bundleID = patchAsset.BundleID;
if (bundleID >= 0 && bundleID < BundleList.Count) if (bundleID >= 0 && bundleID < BundleList.Count)
{ {
var patchBundle = BundleList[bundleID]; var patchBundle = BundleList[bundleID];
return patchBundle.BundleName; return patchBundle;
} }
else else
{ {
@ -166,17 +166,17 @@ namespace YooAsset
/// 获取资源依赖列表 /// 获取资源依赖列表
/// 注意:传入的资源路径一定合法有效! /// 注意:传入的资源路径一定合法有效!
/// </summary> /// </summary>
public string[] GetAllDependencies(string assetPath) public PatchBundle[] GetAllDependencies(string assetPath)
{ {
if (Assets.TryGetValue(assetPath, out PatchAsset patchAsset)) if (AssetDic.TryGetValue(assetPath, out PatchAsset patchAsset))
{ {
List<string> result = new List<string>(patchAsset.DependIDs.Length); List<PatchBundle> result = new List<PatchBundle>(patchAsset.DependIDs.Length);
foreach (var dependID in patchAsset.DependIDs) foreach (var dependID in patchAsset.DependIDs)
{ {
if (dependID >= 0 && dependID < BundleList.Count) if (dependID >= 0 && dependID < BundleList.Count)
{ {
var dependPatchBundle = BundleList[dependID]; var dependPatchBundle = BundleList[dependID];
result.Add(dependPatchBundle.BundleName); result.Add(dependPatchBundle);
} }
else else
{ {
@ -191,6 +191,22 @@ namespace YooAsset
} }
} }
/// <summary>
/// 尝试获取补丁资源
/// </summary>
public bool TryGetPatchAsset(string assetPath, out PatchAsset result)
{
return AssetDic.TryGetValue(assetPath, out result);
}
/// <summary>
/// 尝试获取补丁资源包
/// </summary>
public bool TryGetPatchBundle(string bundleName, out PatchBundle result)
{
return BundleDic.TryGetValue(bundleName, out result);
}
/// <summary> /// <summary>
/// 序列化 /// 序列化
@ -212,7 +228,7 @@ namespace YooAsset
foreach (var patchBundle in patchManifest.BundleList) foreach (var patchBundle in patchManifest.BundleList)
{ {
patchBundle.ParseFlagsValue(); patchBundle.ParseFlagsValue();
patchManifest.Bundles.Add(patchBundle.BundleName, patchBundle); patchManifest.BundleDic.Add(patchBundle.BundleName, patchBundle);
} }
// AssetList // AssetList
@ -220,10 +236,10 @@ namespace YooAsset
{ {
// 注意:我们不允许原始路径存在重名 // 注意:我们不允许原始路径存在重名
string assetPath = patchAsset.AssetPath; string assetPath = patchAsset.AssetPath;
if (patchManifest.Assets.ContainsKey(assetPath)) if (patchManifest.AssetDic.ContainsKey(assetPath))
throw new Exception($"AssetPath have existed : {assetPath}"); throw new Exception($"AssetPath have existed : {assetPath}");
else else
patchManifest.Assets.Add(assetPath, patchAsset); patchManifest.AssetDic.Add(assetPath, patchAsset);
} }
return patchManifest; return patchManifest;

View File

@ -40,19 +40,13 @@ namespace YooAsset
#region IBundleServices接口 #region IBundleServices接口
BundleInfo IBundleServices.GetBundleInfo(AssetInfo assetInfo) BundleInfo IBundleServices.GetBundleInfo(AssetInfo assetInfo)
{ {
if(assetInfo.IsInvalid) if (assetInfo.IsInvalid)
throw new Exception("Should never get here !"); throw new Exception("Should never get here !");
string bundleName = _simulatePatchManifest.GetBundleName(assetInfo.AssetPath); // 注意:如果补丁清单里未找到资源包会抛出异常!
if (_simulatePatchManifest.Bundles.TryGetValue(bundleName, out PatchBundle patchBundle)) var patchBundle = _simulatePatchManifest.GetMainPatchBundle(assetInfo.AssetPath);
{ BundleInfo bundleInfo = new BundleInfo(patchBundle, BundleInfo.ELoadMode.LoadFromEditor, assetInfo.AssetPath);
BundleInfo bundleInfo = new BundleInfo(patchBundle, BundleInfo.ELoadMode.LoadFromEditor, assetInfo.AssetPath); return bundleInfo;
return bundleInfo;
}
else
{
throw new Exception("Should never get here !");
}
} }
BundleInfo[] IBundleServices.GetAllDependBundleInfos(AssetInfo assetInfo) BundleInfo[] IBundleServices.GetAllDependBundleInfos(AssetInfo assetInfo)
{ {
@ -64,7 +58,7 @@ namespace YooAsset
} }
PatchAsset IBundleServices.TryGetPatchAsset(string assetPath) PatchAsset IBundleServices.TryGetPatchAsset(string assetPath)
{ {
if (_simulatePatchManifest.Assets.TryGetValue(assetPath, out PatchAsset patchAsset)) if (_simulatePatchManifest.TryGetPatchAsset(assetPath, out PatchAsset patchAsset))
return patchAsset; return patchAsset;
else else
return null; return null;

View File

@ -56,7 +56,7 @@ namespace YooAsset
OperationSystem.StartOperaiton(operation); OperationSystem.StartOperaiton(operation);
return operation; return operation;
} }
/// <summary> /// <summary>
/// 异步更新补丁清单(弱联网) /// 异步更新补丁清单(弱联网)
/// </summary> /// </summary>
@ -108,7 +108,7 @@ namespace YooAsset
break; break;
} }
} }
if(used == false) if (used == false)
{ {
YooLogger.Log($"Delete unused cache file : {fileInfo.Name}"); YooLogger.Log($"Delete unused cache file : {fileInfo.Name}");
File.Delete(fileInfo.FullName); File.Delete(fileInfo.FullName);
@ -136,7 +136,7 @@ namespace YooAsset
// 忽略APP资源 // 忽略APP资源
// 注意如果是APP资源并且哈希值相同则不需要下载 // 注意如果是APP资源并且哈希值相同则不需要下载
if (AppPatchManifest.Bundles.TryGetValue(patchBundle.BundleName, out PatchBundle appPatchBundle)) if (AppPatchManifest.TryGetPatchBundle(patchBundle.BundleName, out PatchBundle appPatchBundle))
{ {
if (appPatchBundle.IsBuildin && appPatchBundle.Hash == patchBundle.Hash) if (appPatchBundle.IsBuildin && appPatchBundle.Hash == patchBundle.Hash)
continue; continue;
@ -168,7 +168,7 @@ namespace YooAsset
// 忽略APP资源 // 忽略APP资源
// 注意如果是APP资源并且哈希值相同则不需要下载 // 注意如果是APP资源并且哈希值相同则不需要下载
if (AppPatchManifest.Bundles.TryGetValue(patchBundle.BundleName, out PatchBundle appPatchBundle)) if (AppPatchManifest.TryGetPatchBundle(patchBundle.BundleName, out PatchBundle appPatchBundle))
{ {
if (appPatchBundle.IsBuildin && appPatchBundle.Hash == patchBundle.Hash) if (appPatchBundle.IsBuildin && appPatchBundle.Hash == patchBundle.Hash)
continue; continue;
@ -215,21 +215,17 @@ namespace YooAsset
continue; continue;
} }
string mainBundleName = LocalPatchManifest.GetBundleName(assetInfo.AssetPath); // 注意:如果补丁清单里未找到资源包会抛出异常!
if (LocalPatchManifest.Bundles.TryGetValue(mainBundleName, out PatchBundle mainBundle)) PatchBundle mainBundle = LocalPatchManifest.GetMainPatchBundle(assetInfo.AssetPath);
{ if (checkList.Contains(mainBundle) == false)
if (checkList.Contains(mainBundle) == false) checkList.Add(mainBundle);
checkList.Add(mainBundle);
}
string[] dependBundleNames = LocalPatchManifest.GetAllDependencies(assetInfo.AssetPath); // 注意:如果补丁清单里未找到资源包会抛出异常!
foreach (var dependBundleName in dependBundleNames) PatchBundle[] dependBundles = LocalPatchManifest.GetAllDependencies(assetInfo.AssetPath);
foreach (var dependBundle in dependBundles)
{ {
if (LocalPatchManifest.Bundles.TryGetValue(dependBundleName, out PatchBundle dependBundle)) if (checkList.Contains(dependBundle) == false)
{ checkList.Add(dependBundle);
if (checkList.Contains(dependBundle) == false)
checkList.Add(dependBundle);
}
} }
} }
@ -242,7 +238,7 @@ namespace YooAsset
// 忽略APP资源 // 忽略APP资源
// 注意如果是APP资源并且哈希值相同则不需要下载 // 注意如果是APP资源并且哈希值相同则不需要下载
if (AppPatchManifest.Bundles.TryGetValue(patchBundle.BundleName, out PatchBundle appPatchBundle)) if (AppPatchManifest.TryGetPatchBundle(patchBundle.BundleName, out PatchBundle appPatchBundle))
{ {
if (appPatchBundle.IsBuildin && appPatchBundle.Hash == patchBundle.Hash) if (appPatchBundle.IsBuildin && appPatchBundle.Hash == patchBundle.Hash)
continue; continue;
@ -376,53 +372,51 @@ namespace YooAsset
} }
#region IBundleServices接口 #region IBundleServices接口
private BundleInfo CreateBundleInfo(string bundleName) private BundleInfo CreateBundleInfo(PatchBundle patchBundle)
{ {
if (LocalPatchManifest.Bundles.TryGetValue(bundleName, out PatchBundle patchBundle)) if (patchBundle == null)
throw new Exception("Should never get here !");
// 查询沙盒资源
if (DownloadSystem.ContainsVerifyFile(patchBundle.Hash))
{ {
// 查询沙盒资源 BundleInfo bundleInfo = new BundleInfo(patchBundle, BundleInfo.ELoadMode.LoadFromCache);
if (DownloadSystem.ContainsVerifyFile(patchBundle.Hash)) return bundleInfo;
}
// 查询APP资源
if (AppPatchManifest.TryGetPatchBundle(patchBundle.BundleName, out PatchBundle appPatchBundle))
{
if (appPatchBundle.IsBuildin && appPatchBundle.Hash == patchBundle.Hash)
{ {
BundleInfo bundleInfo = new BundleInfo(patchBundle, BundleInfo.ELoadMode.LoadFromCache); BundleInfo bundleInfo = new BundleInfo(appPatchBundle, BundleInfo.ELoadMode.LoadFromStreaming);
return bundleInfo; return bundleInfo;
} }
// 查询APP资源
if (AppPatchManifest.Bundles.TryGetValue(bundleName, out PatchBundle appPatchBundle))
{
if (appPatchBundle.IsBuildin && appPatchBundle.Hash == patchBundle.Hash)
{
BundleInfo bundleInfo = new BundleInfo(appPatchBundle, BundleInfo.ELoadMode.LoadFromStreaming);
return bundleInfo;
}
}
// 从服务端下载
return ConvertToDownloadInfo(patchBundle);
}
else
{
throw new Exception("Should never get here !");
} }
// 从服务端下载
return ConvertToDownloadInfo(patchBundle);
} }
BundleInfo IBundleServices.GetBundleInfo(AssetInfo assetInfo) BundleInfo IBundleServices.GetBundleInfo(AssetInfo assetInfo)
{ {
if (assetInfo.IsInvalid) if (assetInfo.IsInvalid)
throw new Exception("Should never get here !"); throw new Exception("Should never get here !");
string bundleName = LocalPatchManifest.GetBundleName(assetInfo.AssetPath); // 注意:如果补丁清单里未找到资源包会抛出异常!
return CreateBundleInfo(bundleName); var patchBundle = LocalPatchManifest.GetMainPatchBundle(assetInfo.AssetPath);
return CreateBundleInfo(patchBundle);
} }
BundleInfo[] IBundleServices.GetAllDependBundleInfos(AssetInfo assetInfo) BundleInfo[] IBundleServices.GetAllDependBundleInfos(AssetInfo assetInfo)
{ {
if (assetInfo.IsInvalid) if (assetInfo.IsInvalid)
throw new Exception("Should never get here !"); throw new Exception("Should never get here !");
// 注意:如果补丁清单里未找到资源包会抛出异常!
var depends = LocalPatchManifest.GetAllDependencies(assetInfo.AssetPath); var depends = LocalPatchManifest.GetAllDependencies(assetInfo.AssetPath);
List<BundleInfo> result = new List<BundleInfo>(depends.Length); List<BundleInfo> result = new List<BundleInfo>(depends.Length);
foreach (var bundleName in depends) foreach (var patchBundle in depends)
{ {
BundleInfo bundleInfo = CreateBundleInfo(bundleName); BundleInfo bundleInfo = CreateBundleInfo(patchBundle);
result.Add(bundleInfo); result.Add(bundleInfo);
} }
return result.ToArray(); return result.ToArray();
@ -433,7 +427,7 @@ namespace YooAsset
} }
PatchAsset IBundleServices.TryGetPatchAsset(string assetPath) PatchAsset IBundleServices.TryGetPatchAsset(string assetPath)
{ {
if (LocalPatchManifest.Assets.TryGetValue(assetPath, out PatchAsset patchAsset)) if (LocalPatchManifest.TryGetPatchAsset(assetPath, out PatchAsset patchAsset))
return patchAsset; return patchAsset;
else else
return null; return null;

View File

@ -38,36 +38,34 @@ namespace YooAsset
} }
#region IBundleServices接口 #region IBundleServices接口
private BundleInfo CreateBundleInfo(string bundleName) private BundleInfo CreateBundleInfo(PatchBundle patchBundle)
{ {
if (_appPatchManifest.Bundles.TryGetValue(bundleName, out PatchBundle patchBundle)) if (patchBundle == null)
{
BundleInfo bundleInfo = new BundleInfo(patchBundle, BundleInfo.ELoadMode.LoadFromStreaming);
return bundleInfo;
}
else
{
throw new Exception("Should never get here !"); throw new Exception("Should never get here !");
}
BundleInfo bundleInfo = new BundleInfo(patchBundle, BundleInfo.ELoadMode.LoadFromStreaming);
return bundleInfo;
} }
BundleInfo IBundleServices.GetBundleInfo(AssetInfo assetInfo) BundleInfo IBundleServices.GetBundleInfo(AssetInfo assetInfo)
{ {
if (assetInfo.IsInvalid) if (assetInfo.IsInvalid)
throw new Exception("Should never get here !"); throw new Exception("Should never get here !");
string bundleName = _appPatchManifest.GetBundleName(assetInfo.AssetPath); // 注意:如果补丁清单里未找到资源包会抛出异常!
return CreateBundleInfo(bundleName); var patchBundle = _appPatchManifest.GetMainPatchBundle(assetInfo.AssetPath);
return CreateBundleInfo(patchBundle);
} }
BundleInfo[] IBundleServices.GetAllDependBundleInfos(AssetInfo assetInfo) BundleInfo[] IBundleServices.GetAllDependBundleInfos(AssetInfo assetInfo)
{ {
if (assetInfo.IsInvalid) if (assetInfo.IsInvalid)
throw new Exception("Should never get here !"); throw new Exception("Should never get here !");
// 注意:如果补丁清单里未找到资源包会抛出异常!
var depends = _appPatchManifest.GetAllDependencies(assetInfo.AssetPath); var depends = _appPatchManifest.GetAllDependencies(assetInfo.AssetPath);
List<BundleInfo> result = new List<BundleInfo>(depends.Length); List<BundleInfo> result = new List<BundleInfo>(depends.Length);
foreach (var bundleName in depends) foreach (var patchBundle in depends)
{ {
BundleInfo bundleInfo = CreateBundleInfo(bundleName); BundleInfo bundleInfo = CreateBundleInfo(patchBundle);
result.Add(bundleInfo); result.Add(bundleInfo);
} }
return result.ToArray(); return result.ToArray();
@ -78,7 +76,7 @@ namespace YooAsset
} }
PatchAsset IBundleServices.TryGetPatchAsset(string assetPath) PatchAsset IBundleServices.TryGetPatchAsset(string assetPath)
{ {
if (_appPatchManifest.Assets.TryGetValue(assetPath, out PatchAsset patchAsset)) if (_appPatchManifest.TryGetPatchAsset(assetPath, out PatchAsset patchAsset))
return patchAsset; return patchAsset;
else else
return null; return null;