ソースを参照

调整帧消息处理

tanghai 2 年 前
コミット
f82173e102
24 ファイル変更232 行追加70 行削除
  1. 6 0
      Unity/Assets/Config/Proto/LockStepOuter_C_11001.proto
  2. 12 0
      Unity/Assets/Scripts/Codes/Hotfix/Client/LockStep/OneFrameMessagesHandler.cs
  3. 3 0
      Unity/Assets/Scripts/Codes/Hotfix/Client/LockStep/OneFrameMessagesHandler.cs.meta
  4. 0 5
      Unity/Assets/Scripts/Codes/Hotfix/Server/Demo/Session/NetInnerComponentOnReadEvent.cs
  5. 13 0
      Unity/Assets/Scripts/Codes/Hotfix/Server/LockStep/Map/FrameMessageHandler.cs
  6. 0 0
      Unity/Assets/Scripts/Codes/Hotfix/Server/LockStep/Map/FrameMessageHandler.cs.meta
  7. 0 19
      Unity/Assets/Scripts/Codes/Hotfix/Server/LockStep/Map/FrameMessageHelper.cs
  8. 13 12
      Unity/Assets/Scripts/Codes/Hotfix/Share/LockStep/BattleSceneSystem.cs
  9. 13 0
      Unity/Assets/Scripts/Codes/Model/Generate/Client/Message/LockStepOuter_C_11001.cs
  10. 11 0
      Unity/Assets/Scripts/Codes/Model/Generate/Client/Message/LockStepOuter_C_11001.cs.meta
  11. 11 0
      Unity/Assets/Scripts/Codes/Model/Generate/Client/Message/OuterMessage_C_10001.cs.meta
  12. 11 0
      Unity/Assets/Scripts/Codes/Model/Generate/ClientServer/Message/InnerMessage_S_20001.cs.meta
  13. 11 0
      Unity/Assets/Scripts/Codes/Model/Generate/ClientServer/Message/LockStepInner_S_21001.cs.meta
  14. 13 0
      Unity/Assets/Scripts/Codes/Model/Generate/ClientServer/Message/LockStepOuter_C_11001.cs
  15. 11 0
      Unity/Assets/Scripts/Codes/Model/Generate/ClientServer/Message/LockStepOuter_C_11001.cs.meta
  16. 11 0
      Unity/Assets/Scripts/Codes/Model/Generate/ClientServer/Message/OuterMessage_C_10001.cs.meta
  17. 11 0
      Unity/Assets/Scripts/Codes/Model/Generate/Server/Message/InnerMessage_S_20001.cs.meta
  18. 11 0
      Unity/Assets/Scripts/Codes/Model/Generate/Server/Message/LockStepInner_S_21001.cs.meta
  19. 13 0
      Unity/Assets/Scripts/Codes/Model/Generate/Server/Message/LockStepOuter_C_11001.cs
  20. 11 0
      Unity/Assets/Scripts/Codes/Model/Generate/Server/Message/LockStepOuter_C_11001.cs.meta
  21. 11 0
      Unity/Assets/Scripts/Codes/Model/Generate/Server/Message/OuterMessage_C_10001.cs.meta
  22. 24 34
      Unity/Assets/Scripts/Codes/Model/Share/LockStep/FrameBuffer.cs
  23. 9 0
      Unity/Assets/Scripts/Codes/Model/Share/LockStep/ServerFrameRecvComponent.cs
  24. 3 0
      Unity/Assets/Scripts/Codes/Model/Share/LockStep/ServerFrameRecvComponent.cs.meta

+ 6 - 0
Unity/Assets/Config/Proto/LockStepOuter_C_11001.proto

@@ -50,3 +50,9 @@ message FrameMessage // IActorMessage
 	int32 Button = 4;
 }
 
+message OneFrameMessages // IActorMessage
+{
+	int32 Frame = 1;
+	map<int64, FrameMessage> Messages = 2;
+}
+

+ 12 - 0
Unity/Assets/Scripts/Codes/Hotfix/Client/LockStep/OneFrameMessagesHandler.cs

@@ -0,0 +1,12 @@
+namespace ET.Client
+{
+    [MessageHandler(SceneType.Client)]
+    public class OneFrameMessagesHandler: AMHandler<OneFrameMessages>
+    {
+        protected override async ETTask Run(Session session, OneFrameMessages message)
+        {
+            session.DomainScene().GetComponent<BattleScene>().FrameBuffer.AddFrameMessage(message);
+            await ETTask.CompletedTask;
+        }
+    }
+}

+ 3 - 0
Unity/Assets/Scripts/Codes/Hotfix/Client/LockStep/OneFrameMessagesHandler.cs.meta

@@ -0,0 +1,3 @@
+fileFormatVersion: 2
+guid: dd922e556a934545ae5e3ee443eefa16
+timeCreated: 1681740597

+ 0 - 5
Unity/Assets/Scripts/Codes/Hotfix/Server/Demo/Session/NetInnerComponentOnReadEvent.cs

@@ -26,11 +26,6 @@ namespace ET.Server
                 // 收到actor消息,放入actor队列
                 switch (message)
                 {
-                    case FrameMessage frameMessage:
-                    {
-                        FrameMessageHelper.HandleFrameMessage(fromProcess, realActorId, frameMessage);
-                        break;
-                    }
                     case IActorRequest iActorRequest:
                     {
                         await ActorHandleHelper.HandleIActorRequest(fromProcess, realActorId, iActorRequest);

+ 13 - 0
Unity/Assets/Scripts/Codes/Hotfix/Server/LockStep/Map/FrameMessageHandler.cs

@@ -0,0 +1,13 @@
+namespace ET.Server
+{
+    [ActorMessageHandler(SceneType.Room)]
+    public class FrameMessageHandler: AMActorHandler<Scene, FrameMessage>
+    {
+        protected override async ETTask Run(Scene scene, FrameMessage message)
+        {
+            BattleScene battleScene = scene.GetComponent<BattleScene>();
+
+            await ETTask.CompletedTask;
+        }
+    }
+}

+ 0 - 0
Unity/Assets/Scripts/Codes/Hotfix/Server/LockStep/Map/FrameMessageHelper.cs.meta → Unity/Assets/Scripts/Codes/Hotfix/Server/LockStep/Map/FrameMessageHandler.cs.meta


+ 0 - 19
Unity/Assets/Scripts/Codes/Hotfix/Server/LockStep/Map/FrameMessageHelper.cs

@@ -1,19 +0,0 @@
-namespace ET.Server
-{
-    public static class FrameMessageHelper
-    {
-        public static void HandleFrameMessage(int fromProcess, long actorId, FrameMessage frameMessage)
-        {
-            Entity entity = Root.Instance.Get(actorId);
-            if (entity == null)
-            {
-                Log.Error($"actor not found: {actorId} {frameMessage}");
-                return;
-            }
-
-            Scene scene = entity as Scene;
-            BattleScene battleScene = scene.GetComponent<BattleScene>();
-            battleScene.FrameBuffer.AddFrameMessage(frameMessage);
-        }
-    }
-}

+ 13 - 12
Unity/Assets/Scripts/Codes/Hotfix/Share/LockStep/BattleSceneSystem.cs

@@ -1,20 +1,12 @@
 using System;
 using System.Collections.Generic;
+using NUnit.Framework.Constraints;
 
 namespace ET
 {
     [FriendOf(typeof(BattleScene))]
     public static class BattleSceneSystem
     {
-        [ObjectSystem]
-        public class AwakeSystem: AwakeSystem<BattleScene>
-        {
-            protected override void Awake(BattleScene self)
-            {
-                
-            }
-        }
-        
         [ObjectSystem]
         public class UpdateSystem : UpdateSystem<BattleScene>
         {
@@ -23,8 +15,8 @@ namespace ET
                 long timeNow = TimeHelper.ServerFrameTime();
                 if (timeNow > self.StartTime + self.Frame * 50)
                 {
-                    OneFrameMessage oneFrameMessage = self.FrameBuffer.GetFrameMessage(self.Frame);
-                    self.Update(oneFrameMessage);
+                    OneFrameMessages oneFrameMessages = self.FrameBuffer.GetFrameMessage(self.Frame);
+                    self.Update(oneFrameMessages);
                     ++self.Frame;
                 }
             }
@@ -41,7 +33,7 @@ namespace ET
             }
         }
 
-        public static void Update(this BattleScene self, OneFrameMessage oneFrameMessage)
+        public static void Update(this BattleScene self, OneFrameMessages oneFrameMessages)
         {
             // 保存当前帧场景数据
             self.FrameBuffer.SaveDate(self.Frame, MongoHelper.Serialize(self.LSScene));
@@ -52,5 +44,14 @@ namespace ET
             
             self.LSScene.Updater.Update();
         }
+
+        // 回滚
+        public static void Rollback(this BattleScene self, int frame)
+        {
+            byte[] dataBuffer = self.FrameBuffer.GetDate(frame);
+            self.LSScene.Dispose();
+            LSScene lsScene = MongoHelper.Deserialize<LSScene>(dataBuffer);
+            self.LSScene = lsScene;
+        }
     }
 }

+ 13 - 0
Unity/Assets/Scripts/Codes/Model/Generate/Client/Message/LockStepOuter_C_11001.cs

@@ -98,6 +98,18 @@ namespace ET
 
 	}
 
+	[Message(LockStepOuter.OneFrameMessages)]
+	[ProtoContract]
+	public partial class OneFrameMessages: ProtoObject, IActorMessage
+	{
+		[ProtoMember(1)]
+		public int Frame { get; set; }
+
+		[MongoDB.Bson.Serialization.Attributes.BsonDictionaryOptions(MongoDB.Bson.Serialization.Options.DictionaryRepresentation.ArrayOfArrays)]
+		[ProtoMember(2)]
+		public Dictionary<long, FrameMessage> Messages { get; set; }
+	}
+
 	public static class LockStepOuter
 	{
 		 public const ushort C2G_Match = 11002;
@@ -107,5 +119,6 @@ namespace ET
 		 public const ushort LockStepUnitInfo = 11006;
 		 public const ushort Room2C_EnterMap = 11007;
 		 public const ushort FrameMessage = 11008;
+		 public const ushort OneFrameMessages = 11009;
 	}
 }

+ 11 - 0
Unity/Assets/Scripts/Codes/Model/Generate/Client/Message/LockStepOuter_C_11001.cs.meta

@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: f13c8ac43732d4554b0f3ecbf6fb71d5
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 11 - 0
Unity/Assets/Scripts/Codes/Model/Generate/Client/Message/OuterMessage_C_10001.cs.meta

@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 64806f5ea712581408fecb08728105c0
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 11 - 0
Unity/Assets/Scripts/Codes/Model/Generate/ClientServer/Message/InnerMessage_S_20001.cs.meta

@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: e0b72155012589840a78d9d64f29bdce
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 11 - 0
Unity/Assets/Scripts/Codes/Model/Generate/ClientServer/Message/LockStepInner_S_21001.cs.meta

@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 9a6810f88918d4d20ae7b353895f1af1
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 13 - 0
Unity/Assets/Scripts/Codes/Model/Generate/ClientServer/Message/LockStepOuter_C_11001.cs

@@ -98,6 +98,18 @@ namespace ET
 
 	}
 
+	[Message(LockStepOuter.OneFrameMessages)]
+	[ProtoContract]
+	public partial class OneFrameMessages: ProtoObject, IActorMessage
+	{
+		[ProtoMember(1)]
+		public int Frame { get; set; }
+
+		[MongoDB.Bson.Serialization.Attributes.BsonDictionaryOptions(MongoDB.Bson.Serialization.Options.DictionaryRepresentation.ArrayOfArrays)]
+		[ProtoMember(2)]
+		public Dictionary<long, FrameMessage> Messages { get; set; }
+	}
+
 	public static class LockStepOuter
 	{
 		 public const ushort C2G_Match = 11002;
@@ -107,5 +119,6 @@ namespace ET
 		 public const ushort LockStepUnitInfo = 11006;
 		 public const ushort Room2C_EnterMap = 11007;
 		 public const ushort FrameMessage = 11008;
+		 public const ushort OneFrameMessages = 11009;
 	}
 }

+ 11 - 0
Unity/Assets/Scripts/Codes/Model/Generate/ClientServer/Message/LockStepOuter_C_11001.cs.meta

@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: f493672bf2fa046739a1f8fbf88a28c3
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 11 - 0
Unity/Assets/Scripts/Codes/Model/Generate/ClientServer/Message/OuterMessage_C_10001.cs.meta

@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 9a420edf6a4a57a4c8d98e5acdffcfe9
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 11 - 0
Unity/Assets/Scripts/Codes/Model/Generate/Server/Message/InnerMessage_S_20001.cs.meta

@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 77ca20f99751331479808fb220803c31
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 11 - 0
Unity/Assets/Scripts/Codes/Model/Generate/Server/Message/LockStepInner_S_21001.cs.meta

@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: f5da6702a31064c42833a7f9147016ce
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 13 - 0
Unity/Assets/Scripts/Codes/Model/Generate/Server/Message/LockStepOuter_C_11001.cs

@@ -98,6 +98,18 @@ namespace ET
 
 	}
 
+	[Message(LockStepOuter.OneFrameMessages)]
+	[ProtoContract]
+	public partial class OneFrameMessages: ProtoObject, IActorMessage
+	{
+		[ProtoMember(1)]
+		public int Frame { get; set; }
+
+		[MongoDB.Bson.Serialization.Attributes.BsonDictionaryOptions(MongoDB.Bson.Serialization.Options.DictionaryRepresentation.ArrayOfArrays)]
+		[ProtoMember(2)]
+		public Dictionary<long, FrameMessage> Messages { get; set; }
+	}
+
 	public static class LockStepOuter
 	{
 		 public const ushort C2G_Match = 11002;
@@ -107,5 +119,6 @@ namespace ET
 		 public const ushort LockStepUnitInfo = 11006;
 		 public const ushort Room2C_EnterMap = 11007;
 		 public const ushort FrameMessage = 11008;
+		 public const ushort OneFrameMessages = 11009;
 	}
 }

+ 11 - 0
Unity/Assets/Scripts/Codes/Model/Generate/Server/Message/LockStepOuter_C_11001.cs.meta

@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 8fdb6d43fedc543daa3824a136bf364f
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 11 - 0
Unity/Assets/Scripts/Codes/Model/Generate/Server/Message/OuterMessage_C_10001.cs.meta

@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: c0d2c0be69c996a4488513ae7ade42f3
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 24 - 34
Unity/Assets/Scripts/Codes/Model/Share/LockStep/FrameBuffer.cs

@@ -3,59 +3,49 @@ using System.Collections.Generic;
 
 namespace ET
 {
-    public class OneFrameMessage
-    {
-        private readonly SortedList<long, FrameMessage> messages = new (ConstValue.MatchCount);
-
-        public SortedList<long, FrameMessage> Messages
-        {
-            get
-            {
-                return this.messages;
-            }
-        }
-    }
-    
     public class FrameBuffer
     {
         private const int TotalFrameCount = 256;
-        private int NowFrameCount;
-        private readonly List<OneFrameMessage> MessageBuffer = new(TotalFrameCount);
-        private readonly List<byte[]> DataBuffer = new(TotalFrameCount);
+        private int nowFrameCount;
+        private readonly List<OneFrameMessages> messageBuffer = new(TotalFrameCount);
+        private readonly List<byte[]> dataBuffer = new(TotalFrameCount);
         
-        public FrameBuffer()
+        private void CheckFrame(int frame)
         {
-            for (int i = 0; i < TotalFrameCount; i++)
+            if (frame > this.nowFrameCount)
+            {
+                throw new Exception($"frame > max frame: {frame} {this.nowFrameCount}");
+            }
+            if (frame < this.nowFrameCount + 1 - TotalFrameCount || frame < 0)
             {
-                this.MessageBuffer.Add(new OneFrameMessage());
+                throw new Exception($"frame < min frame: {frame} {this.nowFrameCount + 1 - TotalFrameCount}");
             }
         }
 
-        public void AddFrameMessage(FrameMessage message)
+        public void AddFrameMessage(OneFrameMessages message)
         {
-            this.MessageBuffer[message.Frame % TotalFrameCount].Messages.Add(message.PlayerId, message);
-            if (message.Frame > this.NowFrameCount)
+            this.messageBuffer[message.Frame % TotalFrameCount] = message;
+            if (message.Frame > this.nowFrameCount)
             {
-                this.NowFrameCount = message.Frame;
+                this.nowFrameCount = message.Frame;
             }
         }
         
-        public OneFrameMessage GetFrameMessage(int frame)
+        public OneFrameMessages GetFrameMessage(int frame)
         {
-            if (frame > this.NowFrameCount)
-            {
-                throw new Exception($"frame > max frame: {frame} {this.NowFrameCount}");
-            }
-            if (frame < this.NowFrameCount - TotalFrameCount || frame < 0)
-            {
-                throw new Exception($"frame < min frame: {frame} {this.NowFrameCount - 255}");
-            }
-            return this.MessageBuffer[frame % TotalFrameCount];
+            CheckFrame(frame);
+            return this.messageBuffer[frame % TotalFrameCount];
         }
 
         public void SaveDate(int frame, byte[] data)
         {
-            this.DataBuffer[frame % TotalFrameCount] = data;
+            this.dataBuffer[frame % TotalFrameCount] = data;
+        }
+
+        public byte[] GetDate(int frame)
+        {
+            CheckFrame(frame);
+            return this.dataBuffer[frame % TotalFrameCount];
         }
     }
 }

+ 9 - 0
Unity/Assets/Scripts/Codes/Model/Share/LockStep/ServerFrameRecvComponent.cs

@@ -0,0 +1,9 @@
+using System.Collections.Generic;
+
+namespace ET
+{
+    public class ServerFrameRecvComponent: Entity
+    {
+        public Dictionary<long, FrameMessage> FrameMessages = new Dictionary<long, FrameMessage>();
+    }
+}

+ 3 - 0
Unity/Assets/Scripts/Codes/Model/Share/LockStep/ServerFrameRecvComponent.cs.meta

@@ -0,0 +1,3 @@
+fileFormatVersion: 2
+guid: 7b46cd58659b4b738034aca72bf19b18
+timeCreated: 1681737911