diff --git a/Assets/YooAsset/Runtime/FileSystem/DefaultCacheFileSystem/DefaultCacheFileSystem.cs b/Assets/YooAsset/Runtime/FileSystem/DefaultCacheFileSystem/DefaultCacheFileSystem.cs
index ddf93e3e..dee8068b 100644
--- a/Assets/YooAsset/Runtime/FileSystem/DefaultCacheFileSystem/DefaultCacheFileSystem.cs
+++ b/Assets/YooAsset/Runtime/FileSystem/DefaultCacheFileSystem/DefaultCacheFileSystem.cs
@@ -153,7 +153,10 @@ namespace YooAsset
{
var downloader = DownloadCenter.DownloadFileAsync(bundle, param);
downloader.Reference(); //增加下载器的引用计数
- return downloader;
+
+ // 注意:将下载器进行包裹,可以避免父类任务终止的时候,连带子任务里的下载器也一起被终止!
+ var wrapper = new DownloadFileWrapper(downloader);
+ return wrapper;
}
public virtual FSLoadBundleOperation LoadBundleFile(PackageBundle bundle)
{
diff --git a/Assets/YooAsset/Runtime/FileSystem/DefaultCacheFileSystem/Operation/DCFSLoadBundleOperation.cs b/Assets/YooAsset/Runtime/FileSystem/DefaultCacheFileSystem/Operation/DCFSLoadBundleOperation.cs
index f4651558..b588e0aa 100644
--- a/Assets/YooAsset/Runtime/FileSystem/DefaultCacheFileSystem/Operation/DCFSLoadBundleOperation.cs
+++ b/Assets/YooAsset/Runtime/FileSystem/DefaultCacheFileSystem/Operation/DCFSLoadBundleOperation.cs
@@ -54,18 +54,19 @@ namespace YooAsset
if (_steps == ESteps.DownloadFile)
{
- // 注意:下载的异步任务由管理器驱动
- // 注意:不加到子任务列表里,防止Abort的时候将下载器直接关闭!
// 注意:边玩边下下载器引用计数没有Release
if (_downloadFileOp == null)
{
DownloadParam downloadParam = new DownloadParam(int.MaxValue, 60);
_downloadFileOp = _fileSystem.DownloadFileAsync(_bundle, downloadParam);
+ _downloadFileOp.StartOperation();
+ AddChildOperation(_downloadFileOp);
}
if (IsWaitForAsyncComplete)
_downloadFileOp.WaitForAsyncComplete();
+ _downloadFileOp.UpdateOperation();
DownloadProgress = _downloadFileOp.DownloadProgress;
DownloadedBytes = _downloadFileOp.DownloadedBytes;
if (_downloadFileOp.IsDone == false)
@@ -271,18 +272,19 @@ namespace YooAsset
if (_steps == ESteps.DownloadFile)
{
- // 注意:下载的异步任务由管理器驱动
- // 注意:不加到子任务列表里,防止Abort的时候将下载器直接关闭!
// 注意:边玩边下下载器引用计数没有Release
if (_downloadFileOp == null)
{
DownloadParam downloadParam = new DownloadParam(int.MaxValue, 60);
_downloadFileOp = _fileSystem.DownloadFileAsync(_bundle, downloadParam);
+ _downloadFileOp.StartOperation();
+ AddChildOperation(_downloadFileOp);
}
if (IsWaitForAsyncComplete)
_downloadFileOp.WaitForAsyncComplete();
+ _downloadFileOp.UpdateOperation();
DownloadProgress = _downloadFileOp.DownloadProgress;
DownloadedBytes = _downloadFileOp.DownloadedBytes;
if (_downloadFileOp.IsDone == false)
diff --git a/Assets/YooAsset/Runtime/FileSystem/DefaultCacheFileSystem/Operation/internal/DownloadNormalFileOperation.cs b/Assets/YooAsset/Runtime/FileSystem/DefaultCacheFileSystem/Operation/internal/DownloadNormalFileOperation.cs
index 890ce178..e50210ed 100644
--- a/Assets/YooAsset/Runtime/FileSystem/DefaultCacheFileSystem/Operation/internal/DownloadNormalFileOperation.cs
+++ b/Assets/YooAsset/Runtime/FileSystem/DefaultCacheFileSystem/Operation/internal/DownloadNormalFileOperation.cs
@@ -166,12 +166,6 @@ namespace YooAsset
}
internal override void InternalWaitForAsyncComplete()
{
- //TODO 防止下载器挂起陷入无限死循环!
- if (_steps == ESteps.None)
- {
- InternalStart();
- }
-
while (true)
{
//TODO 如果是导入或解压本地文件,执行等待完毕
diff --git a/Assets/YooAsset/Runtime/FileSystem/DefaultCacheFileSystem/Operation/internal/DownloadResumeFileOperation.cs b/Assets/YooAsset/Runtime/FileSystem/DefaultCacheFileSystem/Operation/internal/DownloadResumeFileOperation.cs
index 2cca18c2..9fab65dc 100644
--- a/Assets/YooAsset/Runtime/FileSystem/DefaultCacheFileSystem/Operation/internal/DownloadResumeFileOperation.cs
+++ b/Assets/YooAsset/Runtime/FileSystem/DefaultCacheFileSystem/Operation/internal/DownloadResumeFileOperation.cs
@@ -1,5 +1,4 @@
-using System.Collections.Generic;
-using System.IO;
+using System.IO;
using UnityEngine;
using UnityEngine.Networking;
@@ -186,12 +185,6 @@ namespace YooAsset
}
internal override void InternalWaitForAsyncComplete()
{
- //TODO 防止下载器挂起陷入无限死循环!
- if (_steps == ESteps.None)
- {
- InternalStart();
- }
-
while (true)
{
//TODO 如果是导入或解压本地文件,执行等待完毕
diff --git a/Assets/YooAsset/Runtime/FileSystem/Operation/FSDownloadFileOperation.cs b/Assets/YooAsset/Runtime/FileSystem/Operation/FSDownloadFileOperation.cs
index f9fa7e26..b7dad8c6 100644
--- a/Assets/YooAsset/Runtime/FileSystem/Operation/FSDownloadFileOperation.cs
+++ b/Assets/YooAsset/Runtime/FileSystem/Operation/FSDownloadFileOperation.cs
@@ -34,11 +34,19 @@ namespace YooAsset
DownloadedBytes = 0;
DownloadProgress = 0;
}
- public void Release()
+
+ ///
+ /// 减少引用计数
+ ///
+ public virtual void Release()
{
RefCount--;
}
- public void Reference()
+
+ ///
+ /// 增加引用计数
+ ///
+ public virtual void Reference()
{
RefCount++;
}
diff --git a/Assets/YooAsset/Runtime/FileSystem/Operation/Internal/DownloadAssetBundleOperation.cs b/Assets/YooAsset/Runtime/FileSystem/Operation/Internal/DownloadAssetBundleOperation.cs
index d5178c12..8c261f79 100644
--- a/Assets/YooAsset/Runtime/FileSystem/Operation/Internal/DownloadAssetBundleOperation.cs
+++ b/Assets/YooAsset/Runtime/FileSystem/Operation/Internal/DownloadAssetBundleOperation.cs
@@ -1,5 +1,4 @@
using UnityEngine;
-using UnityEngine.Networking;
namespace YooAsset
{
diff --git a/Assets/YooAsset/Runtime/FileSystem/Operation/Internal/DownloadFileWrapper.cs b/Assets/YooAsset/Runtime/FileSystem/Operation/Internal/DownloadFileWrapper.cs
new file mode 100644
index 00000000..1df1ab0e
--- /dev/null
+++ b/Assets/YooAsset/Runtime/FileSystem/Operation/Internal/DownloadFileWrapper.cs
@@ -0,0 +1,71 @@
+
+namespace YooAsset
+{
+ internal class DownloadFileWrapper : FSDownloadFileOperation
+ {
+ private enum ESteps
+ {
+ None,
+ Download,
+ Done,
+ }
+
+ private readonly FSDownloadFileOperation _downloadFileOp;
+ private ESteps _steps = ESteps.None;
+
+ internal DownloadFileWrapper(FSDownloadFileOperation downloadFileOp) : base(downloadFileOp.Bundle)
+ {
+ _downloadFileOp = downloadFileOp;
+ }
+ internal override void InternalStart()
+ {
+ _steps = ESteps.Download;
+ }
+ internal override void InternalUpdate()
+ {
+ if (_steps == ESteps.None || _steps == ESteps.Done)
+ return;
+
+ if (_steps == ESteps.Download)
+ {
+ if (IsWaitForAsyncComplete)
+ _downloadFileOp.WaitForAsyncComplete();
+
+ if (_downloadFileOp.Status == EOperationStatus.None)
+ return;
+
+ _downloadFileOp.UpdateOperation();
+ Progress = _downloadFileOp.Progress;
+ DownloadedBytes = _downloadFileOp.DownloadedBytes;
+ DownloadProgress = _downloadFileOp.DownloadProgress;
+ if (_downloadFileOp.IsDone == false)
+ return;
+
+ _steps = ESteps.Done;
+ Status = _downloadFileOp.Status;
+ Error = _downloadFileOp.Error;
+ HttpCode = _downloadFileOp.HttpCode;
+ }
+ }
+ internal override void InternalWaitForAsyncComplete()
+ {
+ while (true)
+ {
+ if (ExecuteWhileDone())
+ {
+ _steps = ESteps.Done;
+ break;
+ }
+ }
+ }
+
+ public override void Release()
+ {
+ _downloadFileOp.Release();
+ }
+ public override void Reference()
+ {
+ _downloadFileOp.Reference();
+ }
+ }
+}
\ No newline at end of file
diff --git a/Assets/YooAsset/Runtime/FileSystem/Operation/Internal/DownloadFileWrapper.cs.meta b/Assets/YooAsset/Runtime/FileSystem/Operation/Internal/DownloadFileWrapper.cs.meta
new file mode 100644
index 00000000..0964e08d
--- /dev/null
+++ b/Assets/YooAsset/Runtime/FileSystem/Operation/Internal/DownloadFileWrapper.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 8088863fc7dfbd441bc897380cd7b97f
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/YooAsset/Runtime/OperationSystem/AsyncOperationBase.cs b/Assets/YooAsset/Runtime/OperationSystem/AsyncOperationBase.cs
index 6456c80e..be1b4706 100644
--- a/Assets/YooAsset/Runtime/OperationSystem/AsyncOperationBase.cs
+++ b/Assets/YooAsset/Runtime/OperationSystem/AsyncOperationBase.cs
@@ -113,7 +113,6 @@ namespace YooAsset
///
/// 设置包裹名称
///
- ///
internal void SetPackageName(string packageName)
{
_packageName = packageName;
@@ -224,6 +223,13 @@ namespace YooAsset
if (IsDone)
return;
+ //TODO 防止异步操作被挂起陷入无限死循环!
+ // 例如:文件解压任务或者文件导入任务!
+ if (Status == EOperationStatus.None)
+ {
+ StartOperation();
+ }
+
IsWaitForAsyncComplete = true;
InternalWaitForAsyncComplete();
}
diff --git a/Assets/YooAsset/Runtime/ResourcePackage/Operation/DownloaderOperation.cs b/Assets/YooAsset/Runtime/ResourcePackage/Operation/DownloaderOperation.cs
index 9078cb67..3433c7f6 100644
--- a/Assets/YooAsset/Runtime/ResourcePackage/Operation/DownloaderOperation.cs
+++ b/Assets/YooAsset/Runtime/ResourcePackage/Operation/DownloaderOperation.cs
@@ -100,7 +100,7 @@ namespace YooAsset
/// 当开始下载某个文件
///
public DownloadFileBegin DownloadFileBeginCallback { set; get; }
-
+
internal DownloaderOperation(string packageName, List downloadList, int downloadingMaxNumber, int failedTryAgain, int timeout)
{
@@ -204,6 +204,9 @@ namespace YooAsset
int index = _bundleInfoList.Count - 1;
var bundleInfo = _bundleInfoList[index];
var downloader = bundleInfo.CreateDownloader(_failedTryAgain, _timeout);
+ downloader.StartOperation();
+ this.AddChildOperation(downloader);
+
_downloaders.Add(downloader);
_bundleInfoList.RemoveAt(index);