| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164 | using System;using System.Collections.Generic;namespace Fort23.Core{    public class ComponentQueue : CObject    {        public string TypeName { get; }        private readonly Queue<CObject> _queue = new Queue<CObject>();        public ComponentQueue(string typeName)        {            this.TypeName = typeName;        }        public async void Enqueue(CObject entity)        {            if (entity == null)            {                return;            }            if (!entity.isActive)            {                return;            }            await entity.AwaitTask();            if (!entity.isActive)            {                return;            }            entity.isActive = false;            this._queue.Enqueue(entity);            entity.DormancyObj();        }        public CObject Dequeue()        {            return this._queue.Dequeue();        }        public CObject Peek()        {            return this._queue.Peek();        }        public Queue<CObject> Queue => this._queue;        public int Count => this._queue.Count;        public override void Dispose()        {            while (this._queue.Count > 0)            {                CObject component = this._queue.Dequeue();                component.Dispose();            }        }        public override void ActiveObj()        {        }        public override void DormancyObj()        {        }    }    public class CObjectPool : CObject    {        private static CObjectPool _instance;        public static CObjectPool Instance        {            get            {                if (_instance == null)                {                    _instance = new CObjectPool();                }                return _instance;            }        }        private readonly Dictionary<Type, ComponentQueue> _dictionary = new Dictionary<Type, ComponentQueue>();        public CObject Fetch(Type type)        {            CObject obj;            if (!this._dictionary.TryGetValue(type, out ComponentQueue queue))            {                obj = (CObject)Activator.CreateInstance(type);            }            else if (queue.Count == 0)            {                obj = (CObject)Activator.CreateInstance(type);            }            else            {                obj = queue.Dequeue();            }            obj.isActive = true;            obj.ActiveObj();            return obj;        }        public T Fetch<T>() where T : CObject        {            T t = (T)this.Fetch(typeof(T));            return t;        }        public void Recycle(CObject obj)        {            if (obj == null)            {                return;            }            Type type = obj.GetType();            ComponentQueue queue;            if (!this._dictionary.TryGetValue(type, out queue))            {                queue = new ComponentQueue(type.Name);                this._dictionary.Add(type, queue);            }            queue.Enqueue(obj);        }        public void Clear()        {            foreach (KeyValuePair<Type, ComponentQueue> kv in this._dictionary)            {                kv.Value.Dispose();            }            this._dictionary.Clear();        }        public override void Dispose()        {            foreach (KeyValuePair<Type, ComponentQueue> kv in this._dictionary)            {                kv.Value.Dispose();            }            this._dictionary.Clear();            _instance = null;        }        public override void ActiveObj()        {        }        public override void DormancyObj()        {        }    }}
 |