using UnityEngine; using System.Collections; using System.Collections.Generic; using System; using System.Threading; using System.Linq;
public class Loom : Singleton<Loom> { ? ? //线程中无法自创建,所以需要使用此类时在start中先运行一下这个属性 ? ? public string getLoomVer ? ? { ? ? ? ? get { return "Loom v1.0"; } ? ? }
? ? public static int maxThreads = 8; ? ? static int numThreads;
? ? private List<Action> _actions = new List<Action>(); ? ? public struct DelayedQueueItem ? ? { ? ? ? ? public float time; ? ? ? ? public Action action; ? ? } ? ? private List<DelayedQueueItem> _delayed = new List<DelayedQueueItem>();
? ? List<DelayedQueueItem> _currentDelayed = new List<DelayedQueueItem>();
? ? public void QueueOnMainThread(Action action) ? ? { ? ? ? ? QueueOnMainThread(action, 0f); ? ? } ? ? public void QueueOnMainThread(Action action, float time) ? ? { ? ? ? ? if (time != 0) ? ? ? ? { ? ? ? ? ? ? lock (_delayed) ? ? ? ? ? ? { ? ? ? ? ? ? ? ? _delayed.Add(new DelayedQueueItem { time = Time.time + time, action = action }); ? ? ? ? ? ? } ? ? ? ? } ? ? ? ? else ? ? ? ? { ? ? ? ? ? ? lock (_actions) ? ? ? ? ? ? { ? ? ? ? ? ? ? ? _actions.Add(action); ? ? ? ? ? ? } ? ? ? ? } ? ? }
? ? public Thread RunAsync(Action a) ? ? { ? ? ? ? while (numThreads >= maxThreads) ? ? ? ? { ? ? ? ? ? ? Thread.Sleep(1); ? ? ? ? } ? ? ? ? Interlocked.Increment(ref numThreads); ? ? ? ? ThreadPool.QueueUserWorkItem(RunAction, a); ? ? ? ? return null; ? ? } ? ? private void RunAction(object action) ? ? { ? ? ? ? try ? ? ? ? { ? ? ? ? ? ? ((Action)action)(); ? ? ? ? } ? ? ? ? catch { } ? ? ? ? finally ? ? ? ? { ? ? ? ? ? ? Interlocked.Decrement(ref numThreads); ? ? ? ? } ? ? }
? ? List<Action> _currentActions = new List<Action>(); ? ? // Update is called once per frame ? ? void Update() ? ? { ? ? ? ? lock (_actions) ? ? ? ? { ? ? ? ? ? ? _currentActions.Clear(); ? ? ? ? ? ? _currentActions.AddRange(_actions); ? ? ? ? ? ? _actions.Clear(); ? ? ? ? } ? ? ? ? foreach (var a in _currentActions) ? ? ? ? { ? ? ? ? ? ? a(); ? ? ? ? } ? ? ? ? lock (_delayed) ? ? ? ? { ? ? ? ? ? ? _currentDelayed.Clear(); ? ? ? ? ? ? _currentDelayed.AddRange(_delayed.Where(d => d.time <= Time.time)); ? ? ? ? ? ? foreach (var item in _currentDelayed) ? ? ? ? ? ? ? ? _delayed.Remove(item); ? ? ? ? } ? ? ? ? foreach (var delayed in _currentDelayed) ? ? ? ? { ? ? ? ? ? ? delayed.action(); ? ? ? ? } ? ? } }
|