123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107 |
- using System.Collections;
- using System.Collections.Generic;
- using System.Diagnostics;
- namespace GFGGame
- {
- 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 Stopwatch _watch;
- private static long _frameTime;
- /// <summary>
- /// 异步操作的最小时间片段
- /// </summary>
- public static long MaxTimeSlice { set; get; } = long.MaxValue;
- /// <summary>
- /// 处理器是否繁忙
- /// </summary>
- public static bool IsBusy
- {
- get
- {
- return _watch.ElapsedMilliseconds - _frameTime >= MaxTimeSlice;
- }
- }
- /// <summary>
- /// 初始化异步操作系统
- /// </summary>
- public static void Initialize()
- {
- _watch = Stopwatch.StartNew();
- }
- /// <summary>
- /// 更新异步操作系统
- /// </summary>
- public static void Update()
- {
- _frameTime = _watch.ElapsedMilliseconds;
- // 添加新的异步操作
- if (_addList.Count > 0)
- {
- for (int i = 0; i < _addList.Count; i++)
- {
- var operation = _addList[i];
- _operations.Add(operation);
- }
- _addList.Clear();
- }
- // 更新所有的异步操作
- foreach (var operation in _operations)
- {
- if (IsBusy)
- break;
- operation.Update();
- if (operation.IsDone)
- {
- _removeList.Add(operation);
- operation.Finish();
- }
- }
- // 移除已经完成的异步操作
- if (_removeList.Count > 0)
- {
- foreach (var operation in _removeList)
- {
- _operations.Remove(operation);
- }
- _removeList.Clear();
- }
- }
- /// <summary>
- /// 销毁异步操作系统
- /// </summary>
- public static void DestroyAll()
- {
- _operations.Clear();
- _addList.Clear();
- _removeList.Clear();
- _watch = null;
- _frameTime = 0;
- MaxTimeSlice = long.MaxValue;
- }
- /// <summary>
- /// 开始处理异步操作类
- /// </summary>
- public static void StartOperation(AsyncOperationBase operation)
- {
- _addList.Add(operation);
- operation.Start();
- }
- }
- }
|