Browse Source

客户端为了0GC需要消息池,服务端消息需要跨协程不能有消息池

tanghai 7 năm trước cách đây
mục cha
commit
268135c1da

+ 6 - 2
Server/Model/Server.Model.csproj

@@ -17,6 +17,12 @@
   </PropertyGroup>
   <ItemGroup>
     <Compile Remove="Libs\**" />
+    <Compile Include="..\..\Unity\Assets\Scripts\Module\Message\MessagePool.cs">
+      <Link>Module\Message\MessagePool\ETModel\MessagePool.cs</Link>
+    </Compile>
+    <Compile Include="..\..\Unity\Hotfix\Module\Message\MessagePool.cs">
+      <Link>Module\Message\MessagePool\ETHotfix\MessagePool.cs</Link>
+    </Compile>
     <EmbeddedResource Remove="Libs\**" />
     <None Remove="Libs\**" />
   </ItemGroup>
@@ -87,7 +93,6 @@
     <Compile Include="..\..\Unity\Assets\Scripts\Module\Message\MessageAttribute.cs" Link="Module\Message\MessageAttribute.cs" />
     <Compile Include="..\..\Unity\Assets\Scripts\Module\Message\MessageHandlerAttribute.cs" Link="Module\Message\MessageHandlerAttribute.cs" />
     <Compile Include="..\..\Unity\Assets\Scripts\Module\Message\MessageInfo.cs" Link="Module\Message\MessageInfo.cs" />
-    <Compile Include="..\..\Unity\Assets\Scripts\Module\Message\MessagePool.cs" Link="Module\Message\MessagePool.cs" />
     <Compile Include="..\..\Unity\Assets\Scripts\Module\Message\NetworkComponent.cs" Link="Module\Message\NetworkComponent.cs" />
     <Compile Include="..\..\Unity\Assets\Scripts\Module\Message\Network\AChannel.cs" Link="Module\Message\Network\AChannel.cs" />
     <Compile Include="..\..\Unity\Assets\Scripts\Module\Message\Network\AService.cs" Link="Module\Message\Network\AService.cs" />
@@ -116,7 +121,6 @@
     <Compile Include="..\..\Unity\Assets\Scripts\Other\AppType.cs" Link="Other\AppType.cs" />
     <Compile Include="..\..\Unity\Hotfix\Module\Message\HotfixMessage.cs" Link="Module\Message\HotfixMessage.cs" />
     <Compile Include="..\..\Unity\Hotfix\Module\Message\HotfixOpcode.cs" Link="Module\Message\HotfixOpcode.cs" />
-    <Compile Include="..\..\Unity\Hotfix\Module\Message\MessagePool.cs" Link="Module\Message\MessagePool\MessagePool.cs" />
   </ItemGroup>
   <ItemGroup>
     <PackageReference Include="CommandLineParser" Version="2.2.1" />

+ 46 - 34
Unity/Assets/Scripts/Module/Message/MessagePool.cs

@@ -3,48 +3,60 @@ using System.Collections.Generic;
 
 namespace ETModel
 {
-    public class MessagePool
-    {
-	    public static MessagePool Instance { get; } = new MessagePool();
-	    
-        private readonly Dictionary<Type, Queue<object>> dictionary = new Dictionary<Type, Queue<object>>();
-
-        public object Fetch(Type type)
-        {
-	        Queue<object> queue;
-            if (!this.dictionary.TryGetValue(type, out queue))
-            {
-                queue = new Queue<object>();
-                this.dictionary.Add(type, queue);
-            }
-	        object obj;
+	// 客户端为了0GC需要消息池,服务端消息需要跨协程不需要消息池
+	public class MessagePool
+	{
+		public static MessagePool Instance { get; } = new MessagePool();
+
+#if !SERVER
+		private readonly Dictionary<Type, Queue<object>> dictionary = new Dictionary<Type, Queue<object>>();
+#endif
+
+		public object Fetch(Type type)
+		{
+#if !SERVER
+			Queue<object> queue;
+			if (!this.dictionary.TryGetValue(type, out queue))
+			{
+				queue = new Queue<object>();
+				this.dictionary.Add(type, queue);
+			}
+
+			object obj;
 			if (queue.Count > 0)
-            {
+			{
 				obj = queue.Dequeue();
-            }
+			}
 			else
 			{
-				obj = Activator.CreateInstance(type);	
+				obj = Activator.CreateInstance(type);
 			}
-            return obj;
-        }
 
-        public T Fetch<T>() where T: class
+			return obj;
+#else
+			return Activator.CreateInstance(type);
+#endif
+		}
+
+		public T Fetch<T>() where T : class
 		{
-            T t = (T) this.Fetch(typeof(T));
+			T t = (T) this.Fetch(typeof (T));
 			return t;
 		}
-        
-        public void Recycle(object obj)
-        {
-            Type type = obj.GetType();
-	        Queue<object> queue;
-            if (!this.dictionary.TryGetValue(type, out queue))
-            {
-                queue = new Queue<object>();
+
+		public void Recycle(object obj)
+		{
+#if !SERVER
+			Type type = obj.GetType();
+			Queue<object> queue;
+			if (!this.dictionary.TryGetValue(type, out queue))
+			{
+				queue = new Queue<object>();
 				this.dictionary.Add(type, queue);
-            }
-            queue.Enqueue(obj);
-        }
-    }
+			}
+
+			queue.Enqueue(obj);
+#endif
+		}
+	}
 }

+ 5 - 0
Unity/Assets/Scripts/Module/Message/OpcodeTypeComponent.cs

@@ -62,8 +62,13 @@ namespace ETModel
 			return this.opcodeTypes.GetValueByKey(opcode);
 		}
 		
+		// 客户端为了0GC需要消息池,服务端消息需要跨协程不需要消息池
 		public object GetInstance(ushort opcode)
 		{
+#if SERVER
+			Type type = this.GetType(opcode);
+			return Activator.CreateInstance(type);
+#endif
 			return this.typeMessages[opcode];
 		}
 

+ 24 - 15
Unity/Hotfix/Module/Message/MessagePool.cs

@@ -3,30 +3,37 @@ using System.Collections.Generic;
 
 namespace ETHotfix
 {
+	// 客户端为了0GC需要消息池,服务端消息需要跨协程不需要消息池
     public class MessagePool
     {
 	    public static MessagePool Instance { get; } = new MessagePool();
-	    
+
+#if !SERVER
         private readonly Dictionary<Type, Queue<object>> dictionary = new Dictionary<Type, Queue<object>>();
+#endif
 
         public object Fetch(Type type)
         {
+#if !SERVER
 	        Queue<object> queue;
-            if (!this.dictionary.TryGetValue(type, out queue))
-            {
-                queue = new Queue<object>();
-                this.dictionary.Add(type, queue);
-            }
+	        if (!this.dictionary.TryGetValue(type, out queue))
+	        {
+		        queue = new Queue<object>();
+		        this.dictionary.Add(type, queue);
+	        }
 	        object obj;
-			if (queue.Count > 0)
-            {
-				obj = queue.Dequeue();
-            }
-			else
-			{
-				obj = Activator.CreateInstance(type);	
-			}
-            return obj;
+	        if (queue.Count > 0)
+	        {
+		        obj = queue.Dequeue();
+	        }
+	        else
+	        {
+		        obj = Activator.CreateInstance(type);	
+	        }
+	        return obj;
+#else
+			return Activator.CreateInstance(type);
+#endif
         }
 
         public T Fetch<T>() where T: class
@@ -37,6 +44,7 @@ namespace ETHotfix
         
         public void Recycle(object obj)
         {
+#if !SERVER
             Type type = obj.GetType();
 	        Queue<object> queue;
             if (!this.dictionary.TryGetValue(type, out queue))
@@ -45,6 +53,7 @@ namespace ETHotfix
 				this.dictionary.Add(type, queue);
             }
             queue.Enqueue(obj);
+#endif
         }
     }
 }