mirror of https://github.com/tuyoogame/YooAsset
update operation system
parent
95894f92db
commit
8fe2fa7bc6
|
@ -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()
|
||||||
{
|
{
|
||||||
|
|
|
@ -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();
|
||||||
|
|
Loading…
Reference in New Issue