Update PatchSystem

移除了WeaklyUpdatePatchManifestAsync()方法
新增了CheckPackageContentsAsync()方法
pull/51/head
hevinci 2022-11-04 13:10:08 +08:00
parent 44ec5b3de3
commit 72f0426531
7 changed files with 166 additions and 168 deletions

View File

@ -242,27 +242,26 @@ namespace YooAsset
} }
/// <summary> /// <summary>
/// 弱联网情况下加载本地的补丁清单 /// 检查本地包裹内容的完整性
/// 注意:当清单里的内容验证失败后会返回失败。
/// </summary> /// </summary>
public UpdateManifestOperation WeaklyUpdateManifestAsync() public CheckPackageContentsOperation CheckPackageContentsAsync()
{ {
DebugCheckInitialize(); DebugCheckInitialize();
if (_playMode == EPlayMode.EditorSimulateMode) if (_playMode == EPlayMode.EditorSimulateMode)
{ {
var operation = new EditorPlayModeUpdateManifestOperation(); var operation = new EditorSimulateModeCheckPackageContentsOperation();
OperationSystem.StartOperation(operation); OperationSystem.StartOperation(operation);
return operation; return operation;
} }
else if (_playMode == EPlayMode.OfflinePlayMode) else if (_playMode == EPlayMode.OfflinePlayMode)
{ {
var operation = new OfflinePlayModeUpdateManifestOperation(); var operation = new OfflinePlayModeCheckPackageContentsOperation();
OperationSystem.StartOperation(operation); OperationSystem.StartOperation(operation);
return operation; return operation;
} }
else if (_playMode == EPlayMode.HostPlayMode) else if (_playMode == EPlayMode.HostPlayMode)
{ {
return _hostPlayModeImpl.WeaklyUpdatePatchManifestAsync(PackageName); return _hostPlayModeImpl.CheckPackageContentsAsync(PackageName);
} }
else else
{ {

View File

@ -0,0 +1,134 @@
using System.Collections;
using System.Collections.Generic;
using System.IO;
using UnityEngine;
namespace YooAsset
{
/// <summary>
/// 检查本地包裹内容的完整性
/// </summary>
public abstract class CheckPackageContentsOperation : AsyncOperationBase
{
}
internal sealed class EditorSimulateModeCheckPackageContentsOperation : CheckPackageContentsOperation
{
internal EditorSimulateModeCheckPackageContentsOperation()
{
}
internal override void Start()
{
Status = EOperationStatus.Succeed;
}
internal override void Update()
{
}
}
internal sealed class OfflinePlayModeCheckPackageContentsOperation : CheckPackageContentsOperation
{
internal OfflinePlayModeCheckPackageContentsOperation()
{
}
internal override void Start()
{
Status = EOperationStatus.Succeed;
}
internal override void Update()
{
}
}
internal sealed class HostPlayModeCheckPackageContentsOperation : CheckPackageContentsOperation
{
private enum ESteps
{
None,
CheckLoadedManifest,
InitVerifyingCache,
UpdateVerifyingCache,
Done,
}
private readonly HostPlayModeImpl _impl;
private readonly string _packageName;
private readonly CacheVerifier _cacheVerifier;
private ESteps _steps = ESteps.None;
private float _verifyTime;
internal HostPlayModeCheckPackageContentsOperation(HostPlayModeImpl impl, string packageName)
{
_impl = impl;
_packageName = packageName;
#if UNITY_WEBGL
_cacheVerifier = new CacheVerifierWithoutThread();
#else
_cacheVerifier = new CacheVerifierWithThread();
#endif
}
internal override void Start()
{
_steps = ESteps.CheckLoadedManifest;
}
internal override void Update()
{
if (_steps == ESteps.None || _steps == ESteps.Done)
return;
if (_steps == ESteps.CheckLoadedManifest)
{
if (_impl.LocalPatchManifest == null)
{
_steps = ESteps.Done;
Status = EOperationStatus.Failed;
Error = $"Not found loaded package : {_packageName}";
}
else
{
_steps = ESteps.InitVerifyingCache;
}
}
if (_steps == ESteps.InitVerifyingCache)
{
var verifyInfos = _impl.GetVerifyInfoList(true);
_cacheVerifier.InitVerifier(verifyInfos);
_verifyTime = UnityEngine.Time.realtimeSinceStartup;
_steps = ESteps.UpdateVerifyingCache;
}
if (_steps == ESteps.UpdateVerifyingCache)
{
Progress = _cacheVerifier.GetVerifierProgress();
if (_cacheVerifier.UpdateVerifier())
{
float costTime = UnityEngine.Time.realtimeSinceStartup - _verifyTime;
YooLogger.Log($"Verify result : Success {_cacheVerifier.VerifySuccessList.Count}, Fail {_cacheVerifier.VerifyFailList.Count}, Elapsed time {costTime} seconds");
bool verifySucceed = true;
foreach (var verifyInfo in _cacheVerifier.VerifyFailList)
{
// 注意:跳过内置资源文件
if (verifyInfo.IsBuildinFile)
continue;
verifySucceed = false;
YooLogger.Warning($"Failed verify file : {verifyInfo.VerifyFilePath}");
}
if (verifySucceed)
{
_steps = ESteps.Done;
Status = EOperationStatus.Succeed;
}
else
{
_steps = ESteps.Done;
Status = EOperationStatus.Failed;
Error = $"The package resource {_packageName} content has verify failed file !";
}
}
}
}
}
}

View File

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 3d400b2548d79ca42bec7370f5d66b78
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -10,6 +10,10 @@ namespace YooAsset
/// </summary> /// </summary>
public abstract class InitializationOperation : AsyncOperationBase public abstract class InitializationOperation : AsyncOperationBase
{ {
/// <summary>
/// 初始化内部加载的包裹版本
/// </summary>
public string InitializedPackageVersion;
} }
/// <summary> /// <summary>
@ -54,6 +58,7 @@ namespace YooAsset
YooLogger.Log($"Load simulation manifest file : {_simulatePatchManifestPath}"); YooLogger.Log($"Load simulation manifest file : {_simulatePatchManifestPath}");
string jsonContent = FileUtility.ReadFile(_simulatePatchManifestPath); string jsonContent = FileUtility.ReadFile(_simulatePatchManifestPath);
var manifest = PatchManifest.Deserialize(jsonContent); var manifest = PatchManifest.Deserialize(jsonContent);
InitializedPackageVersion = manifest.PackageVersion;
_impl.SetSimulatePatchManifest(manifest); _impl.SetSimulatePatchManifest(manifest);
_steps = ESteps.Done; _steps = ESteps.Done;
Status = EOperationStatus.Succeed; Status = EOperationStatus.Succeed;
@ -148,8 +153,9 @@ namespace YooAsset
} }
else else
{ {
_steps = ESteps.InitVerifyingCache; InitializedPackageVersion = manifest.PackageVersion;
_impl.SetAppPatchManifest(manifest); _impl.SetAppPatchManifest(manifest);
_steps = ESteps.InitVerifyingCache;
} }
} }
@ -230,6 +236,7 @@ namespace YooAsset
try try
{ {
var manifest = PersistentHelper.LoadCacheManifestFile(_packageName); var manifest = PersistentHelper.LoadCacheManifestFile(_packageName);
InitializedPackageVersion = manifest.PackageVersion;
_impl.SetLocalPatchManifest(manifest); _impl.SetLocalPatchManifest(manifest);
_steps = ESteps.InitVerifyingCache; _steps = ESteps.InitVerifyingCache;
} }
@ -305,6 +312,7 @@ namespace YooAsset
} }
else else
{ {
InitializedPackageVersion = manifest.PackageVersion;
_impl.SetLocalPatchManifest(manifest); _impl.SetLocalPatchManifest(manifest);
_steps = ESteps.InitVerifyingCache; _steps = ESteps.InitVerifyingCache;
} }

View File

@ -243,158 +243,4 @@ namespace YooAsset
return _impl.GetPatchDownloadMainURL(fileName); return _impl.GetPatchDownloadMainURL(fileName);
} }
} }
/// <summary>
/// 联机模式的更新清单操作(弱联网)
/// 注意:优先加载沙盒内的清单文件,如果不存在或加载失败,然后加载内置清单。
/// </summary>
internal sealed class HostPlayModeWeaklyUpdateManifestOperation : UpdateManifestOperation
{
private enum ESteps
{
None,
TryLoadSandboxManifest,
QueryAppPackageVersion,
LoadAppManifest,
InitVerifyingCache,
UpdateVerifyingCache,
Done,
}
private readonly HostPlayModeImpl _impl;
private readonly string _packageName;
private readonly CacheVerifier _cacheVerifier;
private readonly AppPackageVersionQuerier _appPackageVersionQuerier;
private AppManifestLoader _appManifestLoader;
private ESteps _steps = ESteps.None;
private float _verifyTime;
internal HostPlayModeWeaklyUpdateManifestOperation(HostPlayModeImpl impl, string packageName)
{
_impl = impl;
_packageName = packageName;
_appPackageVersionQuerier = new AppPackageVersionQuerier(packageName);
#if UNITY_WEBGL
_cacheVerifier = new CacheVerifierWithoutThread();
#else
_cacheVerifier = new CacheVerifierWithThread();
#endif
}
internal override void Start()
{
_steps = ESteps.TryLoadSandboxManifest;
}
internal override void Update()
{
if (_steps == ESteps.None || _steps == ESteps.Done)
return;
if (_steps == ESteps.TryLoadSandboxManifest)
{
if (PersistentHelper.CheckCacheManifestFileExists(_packageName) == false)
{
_steps = ESteps.QueryAppPackageVersion;
}
else
{
try
{
var manifest = PersistentHelper.LoadCacheManifestFile(_packageName);
_impl.SetLocalPatchManifest(manifest);
_steps = ESteps.InitVerifyingCache;
}
catch (System.Exception e)
{
// 注意:如果加载沙盒内的清单报错,为了避免流程被卡住,我们主动把损坏的文件删除。
YooLogger.Warning($"Failed to load cache manifest file : {e.Message}");
PersistentHelper.DeleteCacheManifestFile(_packageName);
_steps = ESteps.QueryAppPackageVersion;
}
}
}
if (_steps == ESteps.QueryAppPackageVersion)
{
_appPackageVersionQuerier.Update();
if (_appPackageVersionQuerier.IsDone == false)
return;
string error = _appPackageVersionQuerier.Error;
if (string.IsNullOrEmpty(error) == false)
{
_steps = ESteps.Done;
Status = EOperationStatus.Failed;
Error = error;
}
else
{
_appManifestLoader = new AppManifestLoader(_packageName, _appPackageVersionQuerier.Version);
_steps = ESteps.LoadAppManifest;
}
}
if (_steps == ESteps.LoadAppManifest)
{
_appManifestLoader.Update();
Progress = _appManifestLoader.Progress;
if (_appManifestLoader.IsDone == false)
return;
var manifest = _appManifestLoader.Manifest;
if (manifest == null)
{
_steps = ESteps.Done;
Status = EOperationStatus.Failed;
Error = _appManifestLoader.Error;
}
else
{
_steps = ESteps.InitVerifyingCache;
_impl.SetLocalPatchManifest(manifest);
}
}
if (_steps == ESteps.InitVerifyingCache)
{
var verifyInfos = _impl.GetVerifyInfoList(true);
_cacheVerifier.InitVerifier(verifyInfos);
_verifyTime = UnityEngine.Time.realtimeSinceStartup;
_steps = ESteps.UpdateVerifyingCache;
}
if (_steps == ESteps.UpdateVerifyingCache)
{
Progress = _cacheVerifier.GetVerifierProgress();
if (_cacheVerifier.UpdateVerifier())
{
float costTime = UnityEngine.Time.realtimeSinceStartup - _verifyTime;
YooLogger.Log($"Verify result : Success {_cacheVerifier.VerifySuccessList.Count}, Fail {_cacheVerifier.VerifyFailList.Count}, Elapsed time {costTime} seconds");
bool verifySucceed = true;
foreach (var verifyInfo in _cacheVerifier.VerifyFailList)
{
// 注意:跳过内置资源文件
if (verifyInfo.IsBuildinFile)
continue;
verifySucceed = false;
YooLogger.Warning($"Failed verify file : {verifyInfo.VerifyFilePath}");
}
if (verifySucceed)
{
_steps = ESteps.Done;
Status = EOperationStatus.Succeed;
}
else
{
_steps = ESteps.Done;
Status = EOperationStatus.Failed;
Error = $"The package resource {_packageName} content has verify failed file !";
}
}
}
}
}
} }

View File

@ -5,7 +5,7 @@ using UnityEngine;
namespace YooAsset namespace YooAsset
{ {
/// <summary> /// <summary>
/// 更新静态版本操作 /// 获取包裹的最新版本
/// </summary> /// </summary>
public abstract class UpdateStaticVersionOperation : AsyncOperationBase public abstract class UpdateStaticVersionOperation : AsyncOperationBase
{ {
@ -16,7 +16,7 @@ namespace YooAsset
} }
/// <summary> /// <summary>
/// 编辑器下模拟运行的更新静态版本操作 /// 编辑器下模拟运行的获取包裹的最新版本操作
/// </summary> /// </summary>
internal sealed class EditorPlayModeUpdateStaticVersionOperation : UpdateStaticVersionOperation internal sealed class EditorPlayModeUpdateStaticVersionOperation : UpdateStaticVersionOperation
{ {
@ -30,7 +30,7 @@ namespace YooAsset
} }
/// <summary> /// <summary>
/// 离线模式的更新静态版本操作 /// 离线模式的获取包裹的最新版本操作
/// </summary> /// </summary>
internal sealed class OfflinePlayModeUpdateStaticVersionOperation : UpdateStaticVersionOperation internal sealed class OfflinePlayModeUpdateStaticVersionOperation : UpdateStaticVersionOperation
{ {
@ -44,7 +44,7 @@ namespace YooAsset
} }
/// <summary> /// <summary>
/// 联机模式的更新静态版本操作 /// 联机模式的获取包裹的最新版本操作
/// </summary> /// </summary>
internal sealed class HostPlayModeUpdateStaticVersionOperation : UpdateStaticVersionOperation internal sealed class HostPlayModeUpdateStaticVersionOperation : UpdateStaticVersionOperation
{ {

View File

@ -62,11 +62,11 @@ namespace YooAsset
} }
/// <summary> /// <summary>
/// 异步更新补丁清单(弱联网) /// 检查本地包裹内容的完整性
/// </summary> /// </summary>
public UpdateManifestOperation WeaklyUpdatePatchManifestAsync(string packageName) public CheckPackageContentsOperation CheckPackageContentsAsync(string packageName)
{ {
var operation = new HostPlayModeWeaklyUpdateManifestOperation(this, packageName); var operation = new HostPlayModeCheckPackageContentsOperation(this, packageName);
OperationSystem.StartOperation(operation); OperationSystem.StartOperation(operation);
return operation; return operation;
} }