pull/186/head^2
hevinci 2023-09-25 15:38:49 +08:00
parent 1aaf569396
commit dcdf41b7c2
2 changed files with 11 additions and 26 deletions

View File

@ -77,9 +77,9 @@ namespace YooAsset
internal void SetFinish()
{
Progress = 1f;
_callback?.Invoke(this);
if (_taskCompletionSource != null)
_taskCompletionSource.TrySetResult(null);
_callback?.Invoke(this);
}
internal void SetStart()
{

View File

@ -7,8 +7,7 @@ namespace YooAsset
internal class OperationSystem
{
private static readonly List<AsyncOperationBase> _operations = new List<AsyncOperationBase>(100);
private static readonly List<AsyncOperationBase> _addList = new List<AsyncOperationBase>(100);
private static readonly List<AsyncOperationBase> _removeList = new List<AsyncOperationBase>(100);
private static readonly List<AsyncOperationBase> _newList = new List<AsyncOperationBase>(100);
// 计时器相关
private static Stopwatch _watch;
@ -47,39 +46,26 @@ namespace YooAsset
_frameTime = _watch.ElapsedMilliseconds;
// 添加新的异步操作
if (_addList.Count > 0)
if (_newList.Count > 0)
{
for (int i = 0; i < _addList.Count; i++)
{
var operation = _addList[i];
_operations.Add(operation);
}
_addList.Clear();
_operations.AddRange(_newList);
_newList.Clear();
}
// 更新所有的异步操作
foreach (var operation in _operations)
for (int i = _operations.Count - 1; i >= 0; i--)
{
if (IsBusy)
break;
var operation = _operations[i];
operation.Update();
if (operation.IsDone)
{
_removeList.Add(operation);
operation.SetFinish();
_operations.RemoveAt(i);
operation.SetFinish(); //注意:如果业务端发生异常,保证异步操作提前移除。
}
}
// 移除已经完成的异步操作
if (_removeList.Count > 0)
{
foreach (var operation in _removeList)
{
_operations.Remove(operation);
}
_removeList.Clear();
}
}
/// <summary>
@ -88,8 +74,7 @@ namespace YooAsset
public static void DestroyAll()
{
_operations.Clear();
_addList.Clear();
_removeList.Clear();
_newList.Clear();
_watch = null;
_frameTime = 0;
MaxTimeSlice = long.MaxValue;
@ -100,7 +85,7 @@ namespace YooAsset
/// </summary>
public static void StartOperation(AsyncOperationBase operation)
{
_addList.Add(operation);
_newList.Add(operation);
operation.SetStart();
operation.Start();
}