Kaynağa Gözat

优化,未连接成功的时候,消息跟MemoryBuffer不使用对象池,防止池过大

tanghai 2 yıl önce
ebeveyn
işleme
977de259ac

+ 0 - 4
Unity/Assets/Scripts/Core/Module/Network/AService.cs

@@ -40,10 +40,6 @@ namespace ET
         
         public void Recycle(MemoryBuffer memoryStream)
         {
-            if (!memoryStream.IsFromPool)
-            {
-                return;
-            }
             NetServices.Instance.Recycle(memoryStream);
         }
         

+ 8 - 2
Unity/Assets/Scripts/Core/Module/Network/KChannel.cs

@@ -449,14 +449,20 @@ namespace ET
 		
 		public void Send(long actorId, MessageObject message)
 		{
-			MemoryBuffer stream = this.Service.Fetch(message);
-			KcpWaitPacket kcpWaitPacket = new() { ActorId = actorId, MemoryStream = stream };
+			KcpWaitPacket kcpWaitPacket;
+			MemoryBuffer stream;
 			if (!this.IsConnected)
 			{
+				// 没连接成功的时候MemoryBuffer不用对象池,因为这个时候可能会堆积大量消息,造成池过大
+				stream = new MemoryBuffer();
+				MessageSerializeHelper.MessageToStream(stream, message);
+				kcpWaitPacket = new KcpWaitPacket { ActorId = actorId, MemoryStream = stream };
 				this.sendBuffer.Enqueue(kcpWaitPacket);
 				return;
 			}
 			
+			stream = this.Service.Fetch(message);
+			kcpWaitPacket = new KcpWaitPacket { ActorId = actorId, MemoryStream = stream };
 			if (this.kcp == IntPtr.Zero)
 			{
 				throw new Exception("kchannel connected but kcp is zero!");