Ver Fonte

网络层去掉主线程序列化的方法,在网络线程做一个消息的缓存,这样在广播消息的时候,这个消息就不用多次序列化

tanghai há 3 anos atrás
pai
commit
57eef58061

+ 2 - 2
DotNet/ThirdParty/UnityEngine/Vector2.cs

@@ -317,7 +317,7 @@ namespace UnityEngine
             to.Normalize();
             float result;
             Vector2.Dot(ref from, ref to, out result);
-            return Mathf.Cos(Mathf.Clamp(result, -1f, 1f)) * 57.29578f;
+            return Mathf.Acos(Mathf.Clamp(result, -1f, 1f)) * 57.29578f;
         }
 
         public static void Angle(ref Vector2 from, ref Vector2 to, out float result)
@@ -326,7 +326,7 @@ namespace UnityEngine
             to.Normalize();
             float result1;
             Vector2.Dot(ref from, ref to, out result1);
-            result = Mathf.Cos(Mathf.Clamp(result1, -1f, 1f)) * 57.29578f;
+            result = Mathf.Acos(Mathf.Clamp(result1, -1f, 1f)) * 57.29578f;
         }
 
         public static Vector2 Add(Vector2 value1, Vector2 value2)

+ 1 - 1
DotNet/ThirdParty/UnityEngine/Vector3.cs

@@ -567,7 +567,7 @@ namespace UnityEngine
             to.Normalize();
             float result1;
             Vector3.Dot(ref from, ref to, out result1);
-            result = Mathf.Cos(Mathf.Clamp(result1, -1f, 1f)) * 57.29578f;
+            result = Mathf.Acos(Mathf.Clamp(result1, -1f, 1f)) * 57.29578f;
         }
 
         public static Vector3 operator -(Vector3 value)

+ 1 - 1
Unity/Assets/Scripts/Codes/Hotfix/Client/Demo/Ping/PingComponentSystem.cs

@@ -25,7 +25,7 @@ namespace ET.Client
                 long time1 = TimeHelper.ClientNow();
                 try
                 {
-                    G2C_Ping response = await session.Call(self.C2G_Ping) as G2C_Ping;
+                    G2C_Ping response = await session.Call(new C2G_Ping()) as G2C_Ping;
 
                     if (self.InstanceId != instanceId)
                     {

+ 2 - 2
Unity/Assets/Scripts/Codes/Hotfix/Server/Demo/Helper/MessageHelper.cs

@@ -24,10 +24,10 @@ namespace ET.Server
         public static void Broadcast(Unit unit, IActorMessage message)
         {
             Dictionary<long, AOIEntity> dict = unit.GetBeSeePlayers();
-            (ushort _, MemoryStream memoryStream) = MessageSerializeHelper.MessageToStream(message);
+            // 网络底层做了优化,同一个消息不会多次序列化
             foreach (AOIEntity u in dict.Values)
             {
-                ActorMessageSenderComponent.Instance.Send(u.Unit.GetComponent<UnitGateComponent>().GateSessionActorId, memoryStream);
+                ActorMessageSenderComponent.Instance.Send(u.Unit.GetComponent<UnitGateComponent>().GateSessionActorId, message);
             }
         }
         

+ 0 - 13
Unity/Assets/Scripts/Codes/Hotfix/Server/Module/Actor/ActorMessageSenderComponentSystem.cs

@@ -106,19 +106,6 @@ namespace ET.Server
 
             session.Send(processActorId.ActorId, message);
         }
-        
-        public static void Send(this ActorMessageSenderComponent self, long actorId, MemoryStream memoryStream)
-        {
-            if (actorId == 0)
-            {
-                throw new Exception($"actor id is 0: {memoryStream.ToActorMessage()}");
-            }
-            
-            ProcessActorId processActorId = new ProcessActorId(actorId);
-            Session session = NetInnerComponent.Instance.Get(processActorId.Process);
-            session.Send(processActorId.ActorId, memoryStream);
-        }
-
 
         public static int GetRpcId(this ActorMessageSenderComponent self)
         {

+ 5 - 4
Unity/Assets/Scripts/Codes/HotfixView/Client/Demo/Opera/OperaComponentSystem.cs

@@ -33,10 +33,11 @@ namespace ET.Client
                 if (Physics.Raycast(ray, out hit, 1000, self.mapMask))
                 {
                     self.ClickPoint = hit.point;
-                    self.frameClickMap.X = self.ClickPoint.x;
-                    self.frameClickMap.Y = self.ClickPoint.y;
-                    self.frameClickMap.Z = self.ClickPoint.z;
-                    self.ClientScene().GetComponent<SessionComponent>().Session.Send(self.frameClickMap);
+                    C2M_PathfindingResult c2MPathfindingResult = new C2M_PathfindingResult();
+                    c2MPathfindingResult.X = self.ClickPoint.x;
+                    c2MPathfindingResult.Y = self.ClickPoint.y;
+                    c2MPathfindingResult.Z = self.ClickPoint.z;
+                    self.ClientScene().GetComponent<SessionComponent>().Session.Send(c2MPathfindingResult);
                 }
             }
 

+ 0 - 2
Unity/Assets/Scripts/Codes/Model/Client/Demo/Ping/PingComponent.cs

@@ -3,8 +3,6 @@ namespace ET.Client
     [ComponentOf(typeof(Session))]
     public class PingComponent: Entity, IAwake, IDestroy
     {
-        public C2G_Ping C2G_Ping = new C2G_Ping();
-
         public long Ping; //延迟值
     }
 }

+ 0 - 6
Unity/Assets/Scripts/Codes/Model/Share/Module/Message/Session.cs

@@ -127,12 +127,6 @@ namespace ET
             self.LastSendTime = TimeHelper.ClientNow();
             NetServices.Instance.SendMessage(self.ServiceId, self.Id, actorId, message);
         }
-        
-        public static void Send(this Session self, long actorId, MemoryStream memoryStream)
-        {
-            self.LastSendTime = TimeHelper.ClientNow();
-            NetServices.Instance.SendStream(self.ServiceId, self.Id, actorId, memoryStream);
-        }
     }
 
     [ChildOf]

+ 0 - 2
Unity/Assets/Scripts/Codes/ModelView/Client/Demo/Opera/OperaComponent.cs

@@ -10,7 +10,5 @@ namespace ET.Client
         public Vector3 ClickPoint;
 
 	    public int mapMask;
-
-	    public readonly C2M_PathfindingResult frameClickMap = new C2M_PathfindingResult();
     }
 }

+ 18 - 1
Unity/Assets/Scripts/Core/Module/Network/AService.cs

@@ -10,6 +10,23 @@ namespace ET
         
         public ServiceType ServiceType { get; protected set; }
         
+        private (object Message, MemoryStream MemoryStream) lastMessageInfo;
+        
+        // 缓存上一个发送的消息,这样广播消息的时候省掉多次序列化,这样有个另外的问题,客户端就不能保存发送的消息来减少gc,
+        // 不过这个问题并不大,因为客户端发送的消息是比较少的,如果实在需要,也可以修改这个方法,把outer的消息过滤掉。
+        protected MemoryStream GetMemoryStream(object message)
+        {
+            if (object.ReferenceEquals(lastMessageInfo.Message, message))
+            {
+                Log.Debug($"message serialize cache: {message.GetType().Name}");
+                return lastMessageInfo.MemoryStream;
+            }
+
+            (ushort _, MemoryStream stream) = MessageSerializeHelper.MessageToStream(message);
+            this.lastMessageInfo = (message, stream);
+            return stream;
+        }
+        
         public virtual void Dispose()
         {
         }
@@ -22,6 +39,6 @@ namespace ET
 
         public abstract void Create(long id, IPEndPoint address);
 
-        public abstract void Send(long channelId, long actorId, MemoryStream stream);
+        public abstract void Send(long channelId, long actorId, object message);
     }
 }

+ 4 - 2
Unity/Assets/Scripts/Core/Module/Network/KService.cs

@@ -511,14 +511,16 @@ namespace ET
             Log.Info($"channel send fin: {localConn} {remoteConn} {address} {error}");
         }
         
-        public override void Send(long channelId, long actorId, MemoryStream stream)
+        public override void Send(long channelId, long actorId, object message)
         {
             KChannel channel = this.Get(channelId);
             if (channel == null)
             {
                 return;
             }
-            channel.Send(actorId, stream);
+            
+            MemoryStream memoryStream = this.GetMemoryStream(message);
+            channel.Send(actorId, memoryStream);
         }
 
         public override void Update()

+ 1 - 15
Unity/Assets/Scripts/Core/Module/Network/NetServices.cs

@@ -23,7 +23,6 @@ namespace ET
         OnError = 5,
         CreateChannel = 6,
         RemoveChannel = 7,
-        SendStream = 8,
         SendMessage = 9,
         GetKChannelConn = 10,
         ChangeAddress = 11,
@@ -104,12 +103,6 @@ namespace ET
             NetOperator netOperator = new NetOperator() { Op = NetOp.ChangeAddress, ServiceId = serviceId, ChannelId = channelId, Object = ipEndPoint};
             this.netThreadOperators.Enqueue(netOperator);
         }
-
-        public void SendStream(int serviceId, long channelId, long actorId, MemoryStream memoryStream)
-        {
-            NetOperator netOperator = new NetOperator() { Op = NetOp.SendStream, ServiceId = serviceId, ChannelId = channelId, ActorId = actorId, Object = memoryStream };
-            this.netThreadOperators.Enqueue(netOperator);
-        }
         
         public void SendMessage(int serviceId, long channelId, long actorId, object message)
         {
@@ -271,17 +264,10 @@ namespace ET
                             service.Remove(op.ChannelId, (int)op.ActorId);
                             break;
                         }
-                        case NetOp.SendStream:
-                        {
-                            AService service = this.Get(op.ServiceId);
-                            service.Send(op.ChannelId, op.ActorId, op.Object as MemoryStream);
-                            break;
-                        }
                         case NetOp.SendMessage:
                         {
                             AService service = this.Get(op.ServiceId);
-                            (ushort opcode, MemoryStream stream) = MessageSerializeHelper.MessageToStream(op.Object);
-                            service.Send(op.ChannelId, op.ActorId, stream);
+                            service.Send(op.ChannelId, op.ActorId, op.Object);
                             break;
                         }
                         case NetOp.GetKChannelConn:

+ 3 - 2
Unity/Assets/Scripts/Core/Module/Network/TService.cs

@@ -161,7 +161,7 @@ namespace ET
 			this.idChannels.Remove(id);
 		}
 
-		public override void Send(long channelId, long actorId, MemoryStream stream)
+		public override void Send(long channelId, long actorId, object message)
 		{
 			try
 			{
@@ -171,7 +171,8 @@ namespace ET
 					NetServices.Instance.OnError(this.Id, channelId, ErrorCore.ERR_SendMessageNotFoundTChannel);
 					return;
 				}
-				aChannel.Send(actorId, stream);
+				MemoryStream memoryStream = this.GetMemoryStream(message);
+				aChannel.Send(actorId, memoryStream);
 			}
 			catch (Exception e)
 			{

+ 3 - 2
Unity/Assets/Scripts/Core/Module/Network/WService.cs

@@ -133,14 +133,15 @@ namespace ET
             throw new NotImplementedException();
         }
 
-        public override void Send(long channelId, long actorId, MemoryStream stream)
+        public override void Send(long channelId, long actorId, object message)
         {
             this.channels.TryGetValue(channelId, out WChannel channel);
             if (channel == null)
             {
                 return;
             }
-            channel.Send(stream);
+            MemoryStream memoryStream = this.GetMemoryStream(message);
+            channel.Send(memoryStream);
         }
 
         public override void Update()