using AxibugEmuOnline.Client.ClientCore; using Google.Protobuf; using System; using System.Collections.Generic; namespace AxibugEmuOnline.Client.Network { public class ProtobufferMsgPool { Dictionary> _pool = new Dictionary>(); public IMessage Get(Type msgType) { if (!_pool.TryGetValue(msgType, out var queue)) { queue = new Queue(); _pool[msgType] = queue; } if (queue.Count == 0) { var msgIns = Activator.CreateInstance(msgType) as IMessage; return msgIns; } else { var msgIns = queue.Dequeue(); msgIns.Reset(); return msgIns as IMessage; } } public void Release(IMessage msg) { if (msg is IResetable resetableMsg) { var msgType = msg.GetType(); if (!_pool.TryGetValue(msgType, out var queue)) { queue = new Queue(); _pool[msgType] = queue; } queue.Enqueue(resetableMsg); } else { App.log.Error("[NET]" + msg.GetType() + "}未生成Resetable代码"); } } } public interface IResetable { void Reset(); } }