update operation system

pull/189/head
hevinci 2023-09-25 16:08:17 +08:00
parent 95894f92db
commit 8fe2fa7bc6
2 changed files with 16 additions and 33 deletions

View File

@ -90,15 +90,14 @@ namespace YooAsset
Status = EOperationStatus.Failed; Status = EOperationStatus.Failed;
Error = "user abort"; Error = "user abort";
YooLogger.Warning($"Async operaiton has been abort : {this.GetType().Name}"); YooLogger.Warning($"Async operaiton has been abort : {this.GetType().Name}");
SetFinish();
} }
} }
internal void SetFinish() internal void SetFinish()
{ {
Progress = 1f; Progress = 1f;
_callback?.Invoke(this);
if (_taskCompletionSource != null) if (_taskCompletionSource != null)
_taskCompletionSource.TrySetResult(null); _taskCompletionSource.TrySetResult(null);
_callback?.Invoke(this);
} }
internal void SetStart() internal void SetStart()
{ {

View File

@ -7,8 +7,7 @@ namespace YooAsset
internal class OperationSystem internal class OperationSystem
{ {
private static readonly List<AsyncOperationBase> _operations = new List<AsyncOperationBase>(1000); private static readonly List<AsyncOperationBase> _operations = new List<AsyncOperationBase>(1000);
private static readonly List<AsyncOperationBase> _addList = new List<AsyncOperationBase>(1000); private static readonly List<AsyncOperationBase> _newList = new List<AsyncOperationBase>(1000);
private static readonly List<AsyncOperationBase> _removeList = new List<AsyncOperationBase>(1000);
// 计时器相关 // 计时器相关
private static Stopwatch _watch; private static Stopwatch _watch;
@ -47,39 +46,29 @@ namespace YooAsset
_frameTime = _watch.ElapsedMilliseconds; _frameTime = _watch.ElapsedMilliseconds;
// 添加新的异步操作 // 添加新的异步操作
if (_addList.Count > 0) if (_newList.Count > 0)
{ {
for (int i = 0; i < _addList.Count; i++) _operations.AddRange(_newList);
{ _newList.Clear();
var operation = _addList[i];
_operations.Add(operation);
}
_addList.Clear();
} }
// 更新所有的异步操作 // 更新所有的异步操作
for (int i = 0; i < _operations.Count; i++) for (int i = _operations.Count - 1; i >= 0; i--)
{ {
if (IsBusy) if (IsBusy)
break; break;
var operation = _operations[i]; var operation = _operations[i];
operation.Update();
if (operation.IsDone) if (operation.IsDone)
{ {
_removeList.Add(operation); // 注意:如果业务端发生异常,保证异步操作提前移除。
_operations.RemoveAt(i);
operation.SetFinish(); operation.SetFinish();
} }
} else
// 移除已经完成的异步操作
if (_removeList.Count > 0)
{
foreach (var operation in _removeList)
{ {
_operations.Remove(operation); operation.Update();
} }
_removeList.Clear();
} }
} }
@ -89,8 +78,7 @@ namespace YooAsset
public static void DestroyAll() public static void DestroyAll()
{ {
_operations.Clear(); _operations.Clear();
_addList.Clear(); _newList.Clear();
_removeList.Clear();
_watch = null; _watch = null;
_frameTime = 0; _frameTime = 0;
MaxTimeSlice = long.MaxValue; MaxTimeSlice = long.MaxValue;
@ -101,25 +89,21 @@ namespace YooAsset
/// </summary> /// </summary>
public static void ClearPackageOperation(string packageName) public static void ClearPackageOperation(string packageName)
{ {
// 移除临时队列里的任务 // 终止临时队列里的任务
for (int i = _addList.Count - 1; i >= 0; i--) foreach (var operation in _newList)
{ {
var operation = _addList[i];
if (operation.PackageName == packageName) if (operation.PackageName == packageName)
{ {
operation.SetAbort(); operation.SetAbort();
_addList.RemoveAt(i);
} }
} }
// 移除正在进行的任务 // 终止正在进行的任务
for (int i = _operations.Count - 1; i >= 0; i--) foreach (var operation in _operations)
{ {
var operation = _operations[i];
if (operation.PackageName == packageName) if (operation.PackageName == packageName)
{ {
operation.SetAbort(); operation.SetAbort();
_operations.RemoveAt(i);
} }
} }
} }
@ -129,7 +113,7 @@ namespace YooAsset
/// </summary> /// </summary>
public static void StartOperation(string packageName, AsyncOperationBase operation) public static void StartOperation(string packageName, AsyncOperationBase operation)
{ {
_addList.Add(operation); _newList.Add(operation);
operation.SetPackageName(packageName); operation.SetPackageName(packageName);
operation.SetStart(); operation.SetStart();
operation.Start(); operation.Start();