Przeglądaj źródła

修复帧同步的一个bug,同时调整了消息的生命周期,IMessage跟IRequest 在handler结束后释放,IResponse在await这个协程结束后释放,具体请参看代码
好处是类似G2C_Ping这种不需要加using了

tanghai 2 lat temu
rodzic
commit
e5e7a6c163

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

@@ -20,7 +20,7 @@
         }
 
         // 加到mailbox
-        public static void Add(this MailBoxComponent self, Address fromAddress, IMessage messageObject)
+        public static void Add(this MailBoxComponent self, Address fromAddress, MessageObject 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 IMessage MessageObject;
+        public MessageObject MessageObject;
         public MailBoxComponent MailBoxComponent;
     }
     

+ 3 - 1
Unity/Assets/Scripts/Core/Fiber/Module/Actor/MessageInnerSenderSystem.cs

@@ -45,7 +45,7 @@ namespace ET
             }
 
             ActorId actorId = messageInfo.ActorId;
-            IMessage message = messageInfo.MessageObject;
+            MessageObject message = messageInfo.MessageObject;
 
             MailBoxComponent mailBoxComponent = self.Fiber().Mailboxes.Get(actorId.InstanceId);
             if (mailBoxComponent == null)
@@ -56,6 +56,7 @@ namespace ET
                     IResponse resp = MessageHelper.CreateResponse(request, ErrorCore.ERR_NotFoundActor);
                     self.Reply(actorId.Address, resp);
                 }
+                message.Dispose();
                 return;
             }
             mailBoxComponent.Add(actorId.Address, message);
@@ -85,6 +86,7 @@ namespace ET
             }
 
             self.Tcs.SetResult(response);
+            ((MessageObject)response).Dispose();
         }
         
         public static void Reply(this MessageInnerSender self, Address fromAddress, IResponse message)

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

@@ -34,7 +34,7 @@ namespace ET.Client
                 try
                 {
                     C2G_Ping c2GPing = C2G_Ping.Create(true);
-                    using G2C_Ping response = await session.Call(c2GPing) as G2C_Ping;
+                    G2C_Ping response = await session.Call(c2GPing) as G2C_Ping;
 
                     if (self.InstanceId != instanceId)
                     {

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

@@ -159,6 +159,7 @@ namespace ET.Server
             }
 
             self.Tcs.SetResult(response);
+            ((MessageObject)response).Dispose();
         }
 
         public static void Send(this MessageOuterSender self, ActorId actorId, IMessage message)

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

@@ -12,12 +12,12 @@
         {
             MailBoxComponent mailBoxComponent = args.MailBoxComponent;
             
-            // 对象池回收
-            using MessageObject messageObject = (MessageObject)args.MessageObject;
+            MessageObject messageObject = (MessageObject)args.MessageObject;
 
             Fiber fiber = mailBoxComponent.Fiber();
             if (fiber.IsDisposed)
             {
+				messageObject.Dispose();
                 return;
             }
 
@@ -31,6 +31,7 @@
                         IResponse resp = MessageHelper.CreateResponse(request, ErrorCore.ERR_NotFoundActor);
                         mailBoxComponent.Root().GetComponent<MessageInnerSender>().Reply(args.FromAddress, resp);
                     }
+                    messageObject.Dispose();
                     return;
                 }
                 await MessageDispatcher.Instance.Handle(mailBoxComponent.Parent, args.FromAddress, messageObject);

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

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

+ 8 - 3
Unity/Assets/Scripts/Model/Share/Module/Message/MessageSessionHandler.cs

@@ -2,13 +2,18 @@ using System;
 
 namespace ET
 {
-    public abstract class MessageSessionHandler<Message>: IMessageSessionHandler where Message : class
+    public abstract class MessageSessionHandler<Message>: IMessageSessionHandler where Message : MessageObject
     {
         protected abstract ETTask Run(Session session, Message message);
 
         public void Handle(Session session, object msg)
         {
-            Message message = msg as Message;
+            HandleAsync(session, msg).Coroutine();
+        }
+
+        private async ETTask HandleAsync(Session session, object message)
+        {
+            using Message msg = message as Message;
             if (message == null)
             {
                 Log.Error($"消息类型转换错误: {msg.GetType().FullName} to {typeof (Message).Name}");
@@ -21,7 +26,7 @@ namespace ET
                 return;
             }
 
-            this.Run(session, message).Coroutine();
+            await this.Run(session, msg);
         }
 
         public Type GetMessageType()