Ver Fonte

整理代码

tanghai há 2 anos atrás
pai
commit
94902bde35

+ 5 - 1
Unity/Assets/Scripts/Codes/Hotfix/Client/LockStep/OneFrameMessagesHandler.cs

@@ -9,6 +9,7 @@ namespace ET.Client
         {
             Room room = session.DomainScene().GetComponent<Room>();
             FrameBuffer frameBuffer = room.FrameBuffer;
+            
             if (message.Frame != frameBuffer.RealFrame + 1)
             {
                 throw new Exception($"recv oneframeMessage frame error: {message.Frame} {frameBuffer.RealFrame}");
@@ -21,8 +22,11 @@ namespace ET.Client
             {
                 // 回滚到frameBuffer.RealFrame
                 LSHelper.Rollback(room, frameBuffer.RealFrame + 1);
+                
+                message.CopyTo(predictionMessage);
             }
-            frameBuffer.AddRealFrame(message);
+            ++frameBuffer.RealFrame;
+            
             await ETTask.CompletedTask;
         }
     }

+ 1 - 1
Unity/Assets/Scripts/Codes/Hotfix/Client/LockStep/Room2C_AdjustUpdateTimeHandler.cs

@@ -18,7 +18,7 @@ namespace ET.Client
                 newInterval = 66;
             }
             
-            room.FixedTimeCounter.ChangeInterval(newInterval, room.FrameBuffer.NowFrame - 1);
+            room.FixedTimeCounter.ChangeInterval(newInterval, room.FrameBuffer.PredictionFrame - 1);
             await ETTask.CompletedTask;
         }
     }

+ 6 - 34
Unity/Assets/Scripts/Codes/Hotfix/Client/LockStep/RoomClientUpdaterSystem.cs

@@ -31,14 +31,14 @@ namespace ET.Client
             FrameBuffer frameBuffer = room.FrameBuffer;
             long timeNow = TimeHelper.ServerFrameTime();
             Scene clientScene = room.GetParent<Scene>();
-            if (!room.FixedTimeCounter.IsTimeout(timeNow, frameBuffer.NowFrame))
+            if (!room.FixedTimeCounter.IsTimeout(timeNow, frameBuffer.PredictionFrame))
             {
                 return;
             }
             
-            OneFrameMessages oneFrameMessages = GetOneFrameMessages(self, frameBuffer.NowFrame);
+            OneFrameMessages oneFrameMessages = GetOneFrameMessages(self, frameBuffer.PredictionFrame);
             room.Update(oneFrameMessages);
-            ++frameBuffer.NowFrame;
+            ++frameBuffer.PredictionFrame;
 
             FrameMessage frameMessage = NetServices.Instance.FetchMessage<FrameMessage>();
             frameMessage.Frame = oneFrameMessages.Frame;
@@ -64,40 +64,12 @@ namespace ET.Client
         private static OneFrameMessages GetPredictionOneFrameMessage(this RoomClientUpdater self, int frame)
         {
             Room room = self.GetParent<Room>();
+            OneFrameMessages predictionFrame = room.FrameBuffer.GetFrame(frame);
             OneFrameMessages preFrame = room.FrameBuffer.GetFrame(frame - 1);
-            OneFrameMessages predictionFrame  = preFrame != null? MongoHelper.Clone(preFrame) : new OneFrameMessages();
+            preFrame?.CopyTo(predictionFrame);
             predictionFrame.Frame = frame;
-
-            predictionFrame.Inputs[self.MyId] = new() {V = self.Input.V, Button = self.Input.Button};
-            
-            room.FrameBuffer.AddFrame(predictionFrame);
-            
-            return predictionFrame;
-        }
-        
-        // 获取预测一帧的消息
-        private static OneFrameMessages GetRePredictionOneFrameMessage(this RoomClientUpdater self, int frame)
-        {
-            Room room = self.GetParent<Room>();
-            FrameBuffer frameBuffer = room.FrameBuffer;
-            OneFrameMessages preFrame = frameBuffer.GetFrame(frame - 1);
-            OneFrameMessages predictionFrame = frameBuffer.GetFrame(frame);
-            foreach (var kv in predictionFrame.Inputs)
-            {
-                if (kv.Key == self.MyId)
-                {
-                    continue;
-                }
-
-                LSInput preInput = preFrame.Inputs[kv.Key];
-                predictionFrame.Inputs[kv.Key] = preInput;
-            }
-
-            LSInput oldMyInput = frameBuffer.GetFrame(predictionFrame.Frame).Inputs[self.MyId];
-
-            predictionFrame.Inputs[self.MyId] = oldMyInput;
+            predictionFrame.Inputs[self.MyId] = self.Input;
             
-            predictionFrame.Frame = frame;
             return predictionFrame;
         }
     }

+ 2 - 9
Unity/Assets/Scripts/Codes/Hotfix/Server/LockStep/Map/C2Room_ChangeSceneFinishHandler.cs

@@ -11,15 +11,9 @@ namespace ET.Server
         {
             RoomServerComponent roomServerComponent = room.GetComponent<RoomServerComponent>();
             RoomPlayer roomPlayer = room.GetComponent<RoomServerComponent>().GetChild<RoomPlayer>(message.PlayerId);
-            roomPlayer.IsJoinRoom = true;
-            roomServerComponent.AlreadyJoinRoomCount++;
+            roomPlayer.Progress = 100;
 
-            if (roomServerComponent.AlreadyJoinRoomCount <= LSConstValue.MatchCount)
-            {
-                // 通知给已加进来的客户端每个玩家的进度
-            }
-
-            if (roomServerComponent.AlreadyJoinRoomCount == LSConstValue.MatchCount)
+            if (roomServerComponent.IsAllPlayerProgress100())
             {
                 await TimerComponent.Instance.WaitAsync(1000);
 
@@ -40,7 +34,6 @@ namespace ET.Server
 
                 RoomMessageHelper.BroadCast(room, room2CStart);
             }
-
             await ETTask.CompletedTask;
         }
     }

+ 7 - 2
Unity/Assets/Scripts/Codes/Hotfix/Server/LockStep/Map/FrameMessageHandler.cs

@@ -7,8 +7,13 @@ namespace ET.Server
     {
         protected override async ETTask Run(Room room, FrameMessage message)
         {
-            RoomServerUpdater roomServerUpdater = room.GetComponent<RoomServerUpdater>();
-            roomServerUpdater.Add(message);
+            FrameBuffer frameBuffer = room.FrameBuffer;
+            if (message.Frame < frameBuffer.RealFrame)  // 小于RealFrame,丢弃
+            {
+                return;
+            }
+            OneFrameMessages oneFrameMessages = frameBuffer.GetFrame(message.Frame);
+            oneFrameMessages.Inputs[message.PlayerId] = message.Input;
 
             if (message.Frame % (1000 / LSConstValue.UpdateInterval) == 0)
             {

+ 1 - 1
Unity/Assets/Scripts/Codes/Hotfix/Server/LockStep/Map/RoomMessageHelper.cs

@@ -11,7 +11,7 @@ namespace ET.Server
             {
                 RoomPlayer roomPlayer = kv.Value as RoomPlayer;
 
-                if (!roomPlayer.IsJoinRoom)
+                if (!roomPlayer.IsOnline)
                 {
                     continue;
                 }

+ 12 - 0
Unity/Assets/Scripts/Codes/Hotfix/Server/LockStep/Map/RoomServerComponentSystem.cs

@@ -16,5 +16,17 @@ namespace ET.Server
                 }
             }
         }
+
+        public static bool IsAllPlayerProgress100(this RoomServerComponent self)
+        {
+            foreach (RoomPlayer roomPlayer in self.Children.Values)
+            {
+                if (roomPlayer.Progress != 100)
+                {
+                    return false;
+                }
+            }
+            return true;
+        }
     }
 }

+ 13 - 29
Unity/Assets/Scripts/Codes/Hotfix/Server/LockStep/Room/RoomServerUpdaterSystem.cs

@@ -20,44 +20,28 @@ namespace ET.Server
             Room room = self.GetParent<Room>();
             FrameBuffer frameBuffer = room.FrameBuffer;
             long timeNow = TimeHelper.ServerFrameTime();
-            if (!room.FixedTimeCounter.IsTimeout(timeNow, frameBuffer.NowFrame))
-            {
-                return;
-            }
-
-            if (!self.FrameMessages.TryGetValue(self.NowFrame, out OneFrameMessages oneFrameMessages))
+            
+            
+            int frame = frameBuffer.RealFrame + 1;
+            if (!room.FixedTimeCounter.IsTimeout(timeNow, frame))
             {
                 return;
             }
-
+            
+            OneFrameMessages oneFrameMessages = frameBuffer.GetFrame(frame);
             if (oneFrameMessages.Inputs.Count != LSConstValue.MatchCount)
             {
                 return;
             }
-            self.FrameMessages.Remove(oneFrameMessages.Frame);
-            ++self.NowFrame;
+            ++frameBuffer.RealFrame;
             
-            RoomMessageHelper.BroadCast(room, oneFrameMessages);
-        }
-        
-        
-        public static void Add(this RoomServerUpdater self, FrameMessage message)
-        {
-            if (message.Frame < self.NowFrame)
-            {
-                return;
-            }
+            OneFrameMessages sendMessage = NetServices.Instance.FetchMessage<OneFrameMessages>();
             
-            OneFrameMessages oneFrameMessages;
-            if (!self.FrameMessages.TryGetValue(message.Frame, out oneFrameMessages))
-            {
-                oneFrameMessages = new OneFrameMessages
-                {
-                    Frame = message.Frame,
-                };
-                self.FrameMessages.Add(oneFrameMessages.Frame, oneFrameMessages);
-            }
-            oneFrameMessages.Inputs[message.PlayerId] = message.Input;
+            oneFrameMessages.CopyTo(sendMessage);
+            oneFrameMessages.Inputs.Clear();
+            oneFrameMessages.Frame = 0;
+            
+            RoomMessageHelper.BroadCast(room, sendMessage);
         }
     }
 }

+ 1 - 1
Unity/Assets/Scripts/Codes/Hotfix/Share/LockStep/LSHelper.cs

@@ -14,7 +14,7 @@ namespace ET
             self.LSWorld = MongoHelper.Deserialize<LSWorld>(dataBuffer);
 
             // 从回滚的地方重新执行预测的帧
-            for (int i = frameBuffer.RealFrame + 1; i < frameBuffer.NowFrame; ++i)
+            for (int i = frameBuffer.RealFrame + 1; i < frameBuffer.PredictionFrame; ++i)
             {
                 OneFrameMessages oneFrameMessages = frameBuffer.GetFrame(i);
                 self.Update(oneFrameMessages);

+ 1 - 1
Unity/Assets/Scripts/Codes/Hotfix/Share/LockStep/RoomSystem.cs

@@ -22,7 +22,7 @@ namespace ET
         public static void Update(this Room self, OneFrameMessages oneFrameMessages)
         {
             // 保存当前帧场景数据
-            self.FrameBuffer.SaveDate(self.FrameBuffer.NowFrame, MongoHelper.Serialize(self.LSWorld));
+            self.FrameBuffer.SaveDate(self.FrameBuffer.PredictionFrame, MongoHelper.Serialize(self.LSWorld));
             
             // 设置输入到每个LSUnit身上
             LSWorld lsWorld = self.LSWorld;

+ 3 - 1
Unity/Assets/Scripts/Codes/Model/Server/LockStep/Map/RoomPlayer.cs

@@ -4,6 +4,8 @@ namespace ET.Server
     [ChildOf(typeof (RoomServerComponent))]
     public class RoomPlayer: Entity, IAwake
     {
-        public bool IsJoinRoom { get; set; }
+        public int Progress { get; set; }
+
+        public bool IsOnline { get; set; } = true;
     }
 }

+ 0 - 1
Unity/Assets/Scripts/Codes/Model/Server/LockStep/Map/RoomServerComponent.cs

@@ -5,6 +5,5 @@ namespace ET.Server
     [ComponentOf(typeof(Room))]
     public class RoomServerComponent: Entity, IAwake<Match2Map_GetRoom>
     {
-        public int AlreadyJoinRoomCount;
     }
 }

+ 0 - 2
Unity/Assets/Scripts/Codes/Model/Server/LockStep/Room/RoomServerUpdater.cs

@@ -5,7 +5,5 @@ namespace ET.Server
     [ComponentOf(typeof(Room))]
     public class RoomServerUpdater: Entity, IAwake, IUpdate
     {
-        public int NowFrame { get; set; }
-        public Dictionary<long, OneFrameMessages> FrameMessages = new ();
     }
 }

+ 7 - 10
Unity/Assets/Scripts/Codes/Model/Share/LockStep/FrameBuffer.cs

@@ -5,7 +5,7 @@ namespace ET
 {
     public class FrameBuffer
     {
-        public int NowFrame { get; set; }
+        public int PredictionFrame { get; set; }
 
         public int RealFrame { get; set; } = -1;
         
@@ -18,11 +18,11 @@ namespace ET
         {
             for (int i = 0; i < this.dataBuffer.Capacity; ++i)
             {
-                this.messageBuffer.Add(null);
+                this.messageBuffer.Add(new OneFrameMessages());
                 this.dataBuffer.Add(null);
             }
         }
-
+/*
         public void AddRealFrame(OneFrameMessages message)
         {
             if (message.Frame != this.RealFrame + 1)
@@ -37,19 +37,16 @@ namespace ET
         {
             this.messageBuffer[message.Frame % TotalFrameCount] = message;
         }
-        
+        */
         public OneFrameMessages GetFrame(int frame)
         {
             if (frame < 0)
             {
                 return null;
             }
-
-            if (frame > this.RealFrame && frame > this.NowFrame)
-            {
-                return null;
-            }
-            return this.messageBuffer[frame % TotalFrameCount];
+            OneFrameMessages oneFrameMessages = this.messageBuffer[frame % TotalFrameCount];
+            oneFrameMessages.Frame = frame;
+            return oneFrameMessages;
         }
 
         public void SaveDate(int frame, byte[] data)

+ 10 - 0
Unity/Assets/Scripts/Codes/Model/Share/LockStep/OneFrameMessage.cs

@@ -10,6 +10,16 @@ namespace ET
             return this.Frame == other.Frame && Equals(this.Inputs, other.Inputs);
         }
 
+        public void CopyTo(OneFrameMessages to)
+        {
+            to.Frame = this.Frame;
+            to.Inputs.Clear();
+            foreach (var kv in this.Inputs)
+            {
+                to.Inputs.Add(kv.Key, kv.Value);
+            }
+        }
+
         public override bool Equals(object obj)
         {
             if (ReferenceEquals(null, obj))