首次提交
This commit is contained in:
159
Assets/Scripts/NBC/Asset/Runtime/Tasks/Update/CheckUpdateTask.cs
Normal file
159
Assets/Scripts/NBC/Asset/Runtime/Tasks/Update/CheckUpdateTask.cs
Normal file
@@ -0,0 +1,159 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace NBC.Asset
|
||||
{
|
||||
/// <summary>
|
||||
/// 检查更新内容任务
|
||||
/// </summary>
|
||||
public class CheckUpdateTask : NTask
|
||||
{
|
||||
public readonly UpdateContext Context = new UpdateContext();
|
||||
|
||||
enum Step
|
||||
{
|
||||
/// <summary>
|
||||
/// 获取远程版本清单
|
||||
/// </summary>
|
||||
GetVersionData,
|
||||
|
||||
/// <summary>
|
||||
/// 检测版本清单
|
||||
/// </summary>
|
||||
CheckVersionData,
|
||||
|
||||
/// <summary>
|
||||
/// 获取包清单
|
||||
/// </summary>
|
||||
GetPackageData,
|
||||
|
||||
/// <summary>
|
||||
/// 检查包清单
|
||||
/// </summary>
|
||||
CheckPackageData,
|
||||
Success,
|
||||
}
|
||||
|
||||
private Step _step = Step.GetVersionData;
|
||||
|
||||
private DownloadFileTask _getVersionFileTask;
|
||||
|
||||
private DownloadFileTask _getPackageTask;
|
||||
|
||||
protected override NTaskStatus OnProcess()
|
||||
{
|
||||
if (Const.Simulate) return NTaskStatus.Success;
|
||||
if (_step == Step.GetVersionData)
|
||||
{
|
||||
if (_getVersionFileTask == null)
|
||||
{
|
||||
_getVersionFileTask = new DownloadFileTask(
|
||||
Const.GetRemotePath($"{Const.VersionFileName}?t={Util.GetTimestamp()}"),
|
||||
Const.GetCacheTempPath(Const.VersionFileName));
|
||||
_getVersionFileTask.ReDownload = false;
|
||||
_getVersionFileTask.Run();
|
||||
}
|
||||
|
||||
if (!_getVersionFileTask.IsDone) return NTaskStatus.Running;
|
||||
_step = Step.CheckVersionData;
|
||||
}
|
||||
|
||||
if (_step == Step.CheckVersionData)
|
||||
{
|
||||
CheckVersionData();
|
||||
}
|
||||
|
||||
if (_step == Step.GetPackageData)
|
||||
{
|
||||
if (Context.NewVersionData == null)
|
||||
{
|
||||
_step = Step.Success;
|
||||
return NTaskStatus.Running;
|
||||
}
|
||||
|
||||
if (_getPackageTask == null)
|
||||
{
|
||||
var newVersionData = Context.NewVersionData;
|
||||
var fileName = newVersionData.NameHash;
|
||||
_getPackageTask = new DownloadFileTask(Const.GetRemotePath(fileName),
|
||||
Const.GetCacheTempPath(fileName), newVersionData.Hash);
|
||||
_getPackageTask.Run(TaskRunner.Def);
|
||||
}
|
||||
|
||||
if (!_getPackageTask.IsDone) return NTaskStatus.Running;
|
||||
_step = Step.CheckPackageData;
|
||||
}
|
||||
|
||||
if (_step == Step.CheckPackageData)
|
||||
{
|
||||
//检查需要下载的bundle信息
|
||||
CheckPackageData();
|
||||
}
|
||||
|
||||
|
||||
return NTaskStatus.Success;
|
||||
}
|
||||
|
||||
private void CheckVersionData()
|
||||
{
|
||||
var newVersionData = Util.ReadJson<VersionData>(Const.GetCacheTempPath(Const.VersionFileName));
|
||||
var nowVersionData = Addressable.GetVersionData();
|
||||
if (newVersionData != null)
|
||||
{
|
||||
if (newVersionData.Hash == nowVersionData.Hash && newVersionData.Size == nowVersionData.Size)
|
||||
{
|
||||
//没有变化,不需要检查
|
||||
_step = Step.Success;
|
||||
return;
|
||||
}
|
||||
|
||||
Context.NewVersionData = newVersionData;
|
||||
}
|
||||
|
||||
_step = Step.GetPackageData;
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 检查资源包需要更新的bundle
|
||||
/// </summary>
|
||||
private void CheckPackageData()
|
||||
{
|
||||
var fileName = Context.NewVersionData.NameHash;
|
||||
var versionPackageData = Util.ReadJson<VersionPackageData>(Const.GetCacheTempPath(fileName));
|
||||
if (versionPackageData != null)
|
||||
{
|
||||
foreach (var package in versionPackageData.Packages)
|
||||
{
|
||||
var can = package.Def == 1 || Assets.IsNeedfulPackage(package.Name);
|
||||
//不需要检测的包直接跳过
|
||||
if (!can) return;
|
||||
var oldPackageData = Addressable.GetPackageData(package.Name);
|
||||
var different = CompareBundles(package.Bundles, oldPackageData.Bundles);
|
||||
if (different.Count > 0)
|
||||
{
|
||||
foreach (var data in different)
|
||||
{
|
||||
Context.NeedUpdateBundleList.Add(data);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private List<BundleData> CompareBundles(List<BundleData> newBundles, List<BundleData> oldBundles)
|
||||
{
|
||||
List<BundleData> list = new List<BundleData>();
|
||||
foreach (var bundle in newBundles)
|
||||
{
|
||||
var o = oldBundles.Find(b => b.Name == bundle.Name);
|
||||
if (o == null || o.Hash != bundle.Hash || o.Size != bundle.Size)
|
||||
{
|
||||
list.Add(bundle);
|
||||
}
|
||||
}
|
||||
|
||||
return list;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,3 @@
|
||||
fileFormatVersion: 2
|
||||
guid: c86b2e1c83c44b5392fc5b315955ea62
|
||||
timeCreated: 1678695473
|
||||
@@ -0,0 +1,26 @@
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
|
||||
namespace NBC.Asset
|
||||
{
|
||||
public class UpdateContext
|
||||
{
|
||||
/// <summary>
|
||||
/// 需要更新的文件总大小
|
||||
/// </summary>
|
||||
public long DownloadTotalSize => NeedUpdateBundleList.Sum(data => data.Size);
|
||||
|
||||
/// <summary>
|
||||
/// 需要更新的bundles
|
||||
/// </summary>
|
||||
public readonly HashSet<BundleData> NeedUpdateBundleList = new HashSet<BundleData>();
|
||||
|
||||
// /// <summary>
|
||||
// /// 需要更新的package
|
||||
// /// </summary>
|
||||
// public readonly HashSet<string> NeedVersionPackages = new HashSet<string>();
|
||||
|
||||
public VersionData NewVersionData;
|
||||
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,3 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 2c885b61fa9f498996c98a6c15c988ca
|
||||
timeCreated: 1678802682
|
||||
@@ -0,0 +1,65 @@
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
|
||||
namespace NBC.Asset
|
||||
{
|
||||
/// <summary>
|
||||
/// 更新版本内容任务
|
||||
/// </summary>
|
||||
public class UpdateVersionTask : DownloadTaskBase
|
||||
{
|
||||
private UpdateContext _context;
|
||||
private SequenceTaskCollection _sequence = new SequenceTaskCollection();
|
||||
private ParallelTaskCollection _downloadParallel = new ParallelTaskCollection();
|
||||
public override float Progress => _downloadParallel.Progress;
|
||||
|
||||
public UpdateVersionTask(UpdateContext context)
|
||||
{
|
||||
_context = context;
|
||||
}
|
||||
|
||||
protected override void OnStart()
|
||||
{
|
||||
_sequence.FailBreak = true;
|
||||
_downloadParallel.ParallelNum = 5;
|
||||
_downloadParallel.FailBreak = true;
|
||||
var bundles = _context.NeedUpdateBundleList;
|
||||
if (bundles != null && bundles.Count > 0)
|
||||
{
|
||||
foreach (var bundle in bundles)
|
||||
{
|
||||
_downloadParallel.AddTask(new DownloadFileTask(bundle.RemoteDataFilePath,
|
||||
bundle.CachedDataFilePath));
|
||||
}
|
||||
|
||||
_sequence.AddTask(_downloadParallel);
|
||||
}
|
||||
|
||||
_sequence.AddTask(new RunFunctionTask(TryCoverNewVersionData));
|
||||
_sequence.AddTask(new RunFunctionTask(Addressable.Load));
|
||||
|
||||
_sequence.Run(TaskRunner.DownloadRunner);
|
||||
}
|
||||
|
||||
protected override NTaskStatus OnProcess()
|
||||
{
|
||||
return _sequence.IsDone ? _sequence.Status : NTaskStatus.Running;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 尝试覆盖旧的版本清单文件
|
||||
/// </summary>
|
||||
private void TryCoverNewVersionData()
|
||||
{
|
||||
if (_context.NewVersionData != null)
|
||||
{
|
||||
var nameHash = _context.NewVersionData.NameHash;
|
||||
//覆盖旧的清单文件
|
||||
File.Copy(Const.GetCacheTempPath(nameHash), Const.GetCachePath(nameHash), true);
|
||||
}
|
||||
|
||||
//覆盖旧的version.json
|
||||
File.Copy(Const.GetCacheTempPath(Const.VersionFileName), Const.GetCachePath(Const.VersionFileName), true);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,3 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 613c439d2f0342cdb2ec473d38a3c0a3
|
||||
timeCreated: 1678769071
|
||||
Reference in New Issue
Block a user