Просмотр исходного кода

优化ActorMessageQueue必须是IActorMessage消息

tanghai 2 лет назад
Родитель
Сommit
ca7e7f0221

+ 1 - 1
Unity/Assets/Resources/GlobalConfig.asset

@@ -12,6 +12,6 @@ MonoBehaviour:
   m_Script: {fileID: 11500000, guid: 36527db572638af47b03c805671cba75, type: 3}
   m_Name: GlobalConfig
   m_EditorClassIdentifier: 
-  CodeMode: 3
+  CodeMode: 1
   BuildType: 1
   AppType: 7

+ 2 - 2
Unity/Assets/Scripts/Core/Fiber/MailBoxComponent.cs

@@ -20,7 +20,7 @@
         }
 
         // 加到mailbox
-        public static void Add(this MailBoxComponent self, Address fromAddress, MessageObject messageObject)
+        public static void Add(this MailBoxComponent self, Address fromAddress, IActorMessage messageObject)
         {
             // 根据mailboxType进行分发处理
             EventSystem.Instance.Invoke((long)self.MailBoxType, new MailBoxInvoker() {MailBoxComponent = self, MessageObject = messageObject, FromAddress = fromAddress});
@@ -30,7 +30,7 @@
     public struct MailBoxInvoker
     {
         public Address FromAddress;
-        public MessageObject MessageObject;
+        public IActorMessage MessageObject;
         public MailBoxComponent MailBoxComponent;
     }
     

+ 38 - 28
Unity/Assets/Scripts/Core/Fiber/Module/Actor/ActorInnerComponentSystem.cs

@@ -30,35 +30,38 @@ namespace ET
             Fiber fiber = self.Fiber();
             ActorMessageQueue.Instance.Fetch(fiber.Id, 1000, self.list);
 
-            ActorInnerComponent actorInnerComponent = fiber.Root.GetComponent<ActorInnerComponent>();
             foreach (ActorMessageInfo actorMessageInfo in self.list)
             {
-                if (actorMessageInfo.MessageObject is IActorResponse response)
-                {
-                    actorInnerComponent.HandleIActorResponse(response);
-                    continue;
-                }
+                self.HandleMessage(fiber, actorMessageInfo);
+            }
+        }
 
-                ActorId actorId = actorMessageInfo.ActorId;
-                MessageObject message = actorMessageInfo.MessageObject;
+        private static void HandleMessage(this ActorInnerComponent self, Fiber fiber, in ActorMessageInfo actorMessageInfo)
+        {
+            if (actorMessageInfo.MessageObject is IActorResponse response)
+            {
+                self.HandleIActorResponse(response);
+                return;
+            }
+
+            ActorId actorId = actorMessageInfo.ActorId;
+            IActorMessage message = actorMessageInfo.MessageObject;
 
-                MailBoxComponent mailBoxComponent = self.Fiber().Mailboxes.Get(actorId.InstanceId);
-                if (mailBoxComponent == null)
+            MailBoxComponent mailBoxComponent = self.Fiber().Mailboxes.Get(actorId.InstanceId);
+            if (mailBoxComponent == null)
+            {
+                Log.Warning($"actor not found mailbox, from: {actorId} current: {fiber.Address} {message}");
+                if (message is IActorRequest request)
                 {
-                    Log.Warning($"actor not found mailbox, from: {actorId} current: {fiber.Address} {message}");
-                    if (message is IActorRequest request)
-                    {
-                        IActorResponse resp = ActorHelper.CreateResponse(request, ErrorCore.ERR_NotFoundActor);
-                        actorInnerComponent.Reply(actorId.Address, resp);
-                    }
-                    return;
+                    IActorResponse resp = ActorHelper.CreateResponse(request, ErrorCore.ERR_NotFoundActor);
+                    self.Reply(actorId.Address, resp);
                 }
-                mailBoxComponent.Add(actorId.Address, message);
+                return;
             }
+            mailBoxComponent.Add(actorId.Address, message);
         }
-        
-        
-        public static void HandleIActorResponse(this ActorInnerComponent self, IActorResponse response)
+
+        private static void HandleIActorResponse(this ActorInnerComponent self, IActorResponse response)
         {
             if (!self.requestCallback.Remove(response.RpcId, out ActorMessageSender actorMessageSender))
             {
@@ -86,23 +89,30 @@ namespace ET
         
         public static void Reply(this ActorInnerComponent self, Address fromAddress, IActorResponse message)
         {
-            self.Send(new ActorId(fromAddress, 0), message);
+            self.SendInner(new ActorId(fromAddress, 0), message);
         }
 
         public static void Send(this ActorInnerComponent self, ActorId actorId, IActorMessage message)
+        {
+            self.SendInner(actorId, message);
+        }
+
+        private static void SendInner(this ActorInnerComponent self, ActorId actorId, IActorMessage message)
         {
             Fiber fiber = self.Fiber();
+            
             // 如果发向同一个进程,则扔到消息队列中
             if (actorId.Process != fiber.Process)
             {
                 throw new Exception($"actor inner process diff: {actorId.Process} {fiber.Process}");
             }
-            ActorMessageQueue.Instance.Send(fiber.Address, actorId, (MessageObject)message);
-        }
 
-        private static void SendInner(this ActorInnerComponent self, ActorId actorId, MessageObject message)
-        {
-            Fiber fiber = self.Fiber();
+            if (actorId.Fiber == fiber.Id)
+            {
+                self.HandleMessage(fiber, new ActorMessageInfo() {ActorId = actorId, MessageObject = message});
+                return;
+            }
+            
             ActorMessageQueue.Instance.Send(fiber.Address, actorId, message);
         }
 
@@ -150,7 +160,7 @@ namespace ET
 
             self.requestCallback.Add(rpcId, new ActorMessageSender(actorId, iActorRequest, tcs, needException));
             
-            self.SendInner(actorId, iActorRequest as MessageObject);
+            self.SendInner(actorId, iActorRequest);
 
             
             async ETTask Timeout()

+ 9 - 3
Unity/Assets/Scripts/Core/Network/KChannel.cs

@@ -7,13 +7,19 @@ using System.Runtime.InteropServices;
 
 namespace ET
 {
+	public struct KcpMessageInfo
+	{
+		public ActorId ActorId;
+		public MessageObject MessageObject;
+	}
+	
 	public class KChannel : AChannel
 	{
 		private readonly KService Service;
 
 		private Kcp kcp { get; set; }
 
-		private readonly Queue<ActorMessageInfo> waitSendMessages = new Queue<ActorMessageInfo>();
+		private readonly Queue<KcpMessageInfo> waitSendMessages = new();
 		
 		public readonly uint CreateTime;
 
@@ -160,7 +166,7 @@ namespace ET
 					break;
 				}
 				
-				ActorMessageInfo buffer = this.waitSendMessages.Dequeue();
+				KcpMessageInfo buffer = this.waitSendMessages.Dequeue();
 				this.Send(buffer.ActorId, buffer.MessageObject);
 			}
 		}
@@ -437,7 +443,7 @@ namespace ET
 		{
 			if (!this.IsConnected)
 			{
-				ActorMessageInfo actorMessageInfo = new() { ActorId = actorId, MessageObject = message };
+				KcpMessageInfo actorMessageInfo = new() { ActorId = actorId, MessageObject = message };
 				this.waitSendMessages.Enqueue(actorMessageInfo);
 				return;
 			}

+ 4 - 4
Unity/Assets/Scripts/Core/World/Module/Actor/ActorMessageQueue.cs

@@ -6,7 +6,7 @@ namespace ET
     public struct ActorMessageInfo
     {
         public ActorId ActorId;
-        public MessageObject MessageObject;
+        public IActorMessage MessageObject;
     }
     
     public class ActorMessageQueue: Singleton<ActorMessageQueue>, ISingletonAwake
@@ -17,17 +17,17 @@ namespace ET
         {
         }
 
-        public void Send(ActorId actorId, MessageObject messageObject)
+        public void Send(ActorId actorId, IActorMessage messageObject)
         {
             this.Send(actorId.Address, actorId, messageObject);
         }
         
-        public void Reply(ActorId actorId, MessageObject messageObject)
+        public void Reply(ActorId actorId, IActorMessage messageObject)
         {
             this.Send(actorId.Address, actorId, messageObject);
         }
         
-        public void Send(Address fromAddress, ActorId actorId, MessageObject messageObject)
+        public void Send(Address fromAddress, ActorId actorId, IActorMessage messageObject)
         {
             if (!this.messages.TryGetValue(actorId.Address.Fiber, out var queue))
             {

+ 2 - 2
Unity/Assets/Scripts/Hotfix/Client/Module/Message/NetClientComponentSystem.cs

@@ -45,10 +45,10 @@ namespace ET.Client
                     session.OnResponse(response);
                     break;
                 }
-                case IActorMessage:
+                case IActorMessage iActorMessage:
                 {
                     // 扔到Main纤程队列中
-                    ActorMessageQueue.Instance.Send(new ActorId(self.Fiber().Process, ConstFiberId.Main), message as MessageObject);
+                    self.Fiber().ActorInnerComponent.Send(new ActorId(self.Fiber().Process, ConstFiberId.Main), iActorMessage);
                     break;
                 }
                 default:

+ 1 - 1
Unity/Assets/Scripts/Hotfix/Server/Demo/Gate/MailBoxType_GateSessionHandler.cs

@@ -8,7 +8,7 @@
             MailBoxComponent mailBoxComponent = args.MailBoxComponent;
             
             // 这里messageObject要发送出去,不能回收
-            MessageObject messageObject = args.MessageObject;
+            IActorMessage messageObject = args.MessageObject;
             
             if (mailBoxComponent.Parent is PlayerSessionComponent playerSessionComponent)
             {

+ 1 - 1
Unity/Assets/Scripts/Hotfix/Server/Module/Message/ActorOuterComponentSystem.cs

@@ -83,7 +83,7 @@ namespace ET.Server
                 }
                 default:
                 {
-                    ActorMessageQueue.Instance.Send(actorId, (MessageObject)message);
+                    fiber.ActorInnerComponent.Send(actorId, (IActorMessage)message);
                     break;
                 }
             }

+ 1 - 1
Unity/Assets/Scripts/Hotfix/Server/Module/Message/ActorSenderComponentSystem.cs

@@ -13,7 +13,7 @@ namespace ET
             // 如果发向同一个进程,则扔到消息队列中
             if (actorId.Process == fiber.Process)
             {
-                ActorMessageQueue.Instance.Send(fiber.Address, actorId, (MessageObject)message);
+                fiber.ActorInnerComponent.Send(actorId, message);
                 return;
             }
             

+ 1 - 1
Unity/Assets/Scripts/Hotfix/Share/Module/Actor/MailBoxType_OrderedMessageHandler.cs

@@ -13,7 +13,7 @@
             MailBoxComponent mailBoxComponent = args.MailBoxComponent;
             
             // 对象池回收
-            using MessageObject messageObject = args.MessageObject;
+            using MessageObject messageObject = (MessageObject)args.MessageObject;
 
             Fiber fiber = mailBoxComponent.Fiber();
             if (fiber.IsDisposed)

+ 1 - 1
Unity/Assets/Scripts/Hotfix/Share/Module/Actor/MailBoxType_UnOrderedMessageHandler.cs

@@ -12,7 +12,7 @@
         {
             MailBoxComponent mailBoxComponent = args.MailBoxComponent;
             
-            using MessageObject messageObject = args.MessageObject;
+            using MessageObject messageObject = (MessageObject)args.MessageObject;
             
             await ActorMessageDispatcherComponent.Instance.Handle(mailBoxComponent.Parent, args.FromAddress, messageObject);
         }