Преглед изворни кода

动态调整帧率,让客户端的帧必须提前两帧左右到达服务端

tanghai пре 2 година
родитељ
комит
70af7ad61a
31 измењених фајлова са 280 додато и 113 уклоњено
  1. 5 0
      Unity/Assets/Config/Proto/LockStepOuter_C_11001.proto
  2. 2 14
      Unity/Assets/Scripts/Codes/Hotfix/Client/LockStep/OneFrameMessagesHandler.cs
  3. 25 0
      Unity/Assets/Scripts/Codes/Hotfix/Client/LockStep/Room2C_AdjustUpdateTimeHandler.cs
  4. 3 0
      Unity/Assets/Scripts/Codes/Hotfix/Client/LockStep/Room2C_AdjustUpdateTimeHandler.cs.meta
  5. 47 20
      Unity/Assets/Scripts/Codes/Hotfix/Client/LockStep/RoomClientUpdaterSystem.cs
  6. 2 0
      Unity/Assets/Scripts/Codes/Hotfix/Server/LockStep/Map/C2Room_ChangeSceneFinishHandler.cs
  7. 8 5
      Unity/Assets/Scripts/Codes/Hotfix/Server/LockStep/Map/FrameMessageHandler.cs
  8. 0 2
      Unity/Assets/Scripts/Codes/Hotfix/Server/LockStep/Map/RoomManagerComponentSystem.cs
  9. 63 0
      Unity/Assets/Scripts/Codes/Hotfix/Server/LockStep/Room/RoomServerUpdaterSystem.cs
  10. 0 0
      Unity/Assets/Scripts/Codes/Hotfix/Server/LockStep/Room/RoomServerUpdaterSystem.cs.meta
  11. 0 42
      Unity/Assets/Scripts/Codes/Hotfix/Server/LockStep/Room/ServerFrameRecvComponentSystem.cs
  12. 26 0
      Unity/Assets/Scripts/Codes/Hotfix/Share/LockStep/LSHelper.cs
  13. 3 0
      Unity/Assets/Scripts/Codes/Hotfix/Share/LockStep/LSHelper.cs.meta
  14. 4 11
      Unity/Assets/Scripts/Codes/Hotfix/Share/LockStep/RoomSystem.cs
  15. 4 4
      Unity/Assets/Scripts/Codes/HotfixView/Client/LockStep/LSOperaComponentSystem.cs
  16. 0 0
      Unity/Assets/Scripts/Codes/HotfixView/Client/LockStep/LSOperaComponentSystem.cs.meta
  17. 1 1
      Unity/Assets/Scripts/Codes/HotfixView/Client/LockStep/LockStepSceneInitFinish_Finish.cs
  18. 2 0
      Unity/Assets/Scripts/Codes/Model/Client/LockStep/RoomClientUpdater.cs
  19. 10 0
      Unity/Assets/Scripts/Codes/Model/Generate/Client/Message/LockStepOuter_C_11001.cs
  20. 10 0
      Unity/Assets/Scripts/Codes/Model/Generate/ClientServer/Message/LockStepOuter_C_11001.cs
  21. 10 0
      Unity/Assets/Scripts/Codes/Model/Generate/Server/Message/LockStepOuter_C_11001.cs
  22. 2 2
      Unity/Assets/Scripts/Codes/Model/Server/LockStep/Room/RoomServerUpdater.cs
  23. 0 0
      Unity/Assets/Scripts/Codes/Model/Server/LockStep/Room/RoomServerUpdater.cs.meta
  24. 38 0
      Unity/Assets/Scripts/Codes/Model/Share/LockStep/FixedTimeCounter.cs
  25. 3 0
      Unity/Assets/Scripts/Codes/Model/Share/LockStep/FixedTimeCounter.cs.meta
  26. 2 4
      Unity/Assets/Scripts/Codes/Model/Share/LockStep/FrameBuffer.cs
  27. 1 1
      Unity/Assets/Scripts/Codes/Model/Share/LockStep/LSConstValue.cs
  28. 2 0
      Unity/Assets/Scripts/Codes/Model/Share/LockStep/Room.cs
  29. 7 0
      Unity/Assets/Scripts/Codes/ModelView/Client/LockStep/LSOperaComponent.cs
  30. 0 0
      Unity/Assets/Scripts/Codes/ModelView/Client/LockStep/LSOperaComponent.cs.meta
  31. 0 7
      Unity/Assets/Scripts/Codes/ModelView/Client/LockStep/LockStepOperaComponent.cs

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

@@ -61,3 +61,8 @@ message OneFrameMessages // IActorMessage
 	map<int64, LSInput> Inputs = 2;
 }
 
+message Room2C_AdjustUpdateTime // IActorMessage
+{
+	int32 DiffTime = 1;
+}
+

+ 2 - 14
Unity/Assets/Scripts/Codes/Hotfix/Client/LockStep/OneFrameMessagesHandler.cs

@@ -20,21 +20,9 @@ namespace ET.Client
             if (message != predictionMessage)
             {
                 // 回滚到frameBuffer.RealFrame
-                room.Rollback(frameBuffer.RealFrame);
-                frameBuffer.AddRealFrame(message);
+                LSHelper.Rollback(room, frameBuffer.RealFrame + 1);
             }
-            else
-            {
-                frameBuffer.AddRealFrame(message);
-            }
-
-            PingComponent pingComponent = session.GetComponent<PingComponent>();
-            int prediction = (int) (pingComponent.Ping / 2f / LSConstValue.UpdateInterval) + 1;
-            if (prediction < 3)
-            {
-                prediction = 3;
-            }
-            frameBuffer.PredictionCount = prediction;
+            frameBuffer.AddRealFrame(message);
             await ETTask.CompletedTask;
         }
     }

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

@@ -0,0 +1,25 @@
+namespace ET.Client
+{
+    [MessageHandler(SceneType.Client)]
+    public class Room2C_AdjustUpdateTimeHandler: AMHandler<Room2C_AdjustUpdateTime>
+    {
+        protected override async ETTask Run(Session session, Room2C_AdjustUpdateTime message)
+        {
+            Room room = session.DomainScene().GetComponent<Room>();
+            int newInterval = (1000 + (message.DiffTime - LSConstValue.UpdateInterval * 2)) * LSConstValue.UpdateInterval / 1000;
+
+            if (newInterval < 40)
+            {
+                newInterval = 40;
+            }
+
+            if (newInterval > 66)
+            {
+                newInterval = 66;
+            }
+            
+            room.FixedTimeCounter.ChangeInterval(newInterval, room.FrameBuffer.NowFrame - 1);
+            await ETTask.CompletedTask;
+        }
+    }
+}

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

@@ -0,0 +1,3 @@
+fileFormatVersion: 2
+guid: e4df743a2d294ae59bf4844174591716
+timeCreated: 1682414000

+ 47 - 20
Unity/Assets/Scripts/Codes/Hotfix/Client/LockStep/RoomClientUpdaterSystem.cs

@@ -1,4 +1,5 @@
 using System;
+using System.IO;
 using MongoDB.Bson;
 
 namespace ET.Client
@@ -6,6 +7,15 @@ namespace ET.Client
     [FriendOf(typeof (RoomClientUpdater))]
     public static class RoomClientUpdaterSystem
     {
+        public class AwakeSystem: AwakeSystem<RoomClientUpdater>
+        {
+            protected override void Awake(RoomClientUpdater self)
+            {
+                Room room = self.GetParent<Room>();
+                self.MyId = room.GetParent<Scene>().GetComponent<PlayerComponent>().MyId;
+            }
+        }
+        
         [FriendOf(typeof (Room))]
         public class UpdateSystem: UpdateSystem<RoomClientUpdater>
         {
@@ -20,18 +30,18 @@ namespace ET.Client
             Room room = self.GetParent<Room>();
             FrameBuffer frameBuffer = room.FrameBuffer;
             long timeNow = TimeHelper.ServerFrameTime();
-
-            for (int i = 0; i < 5; ++i)
+            Scene clientScene = room.GetParent<Scene>();
+            if (!room.FixedTimeCounter.IsTimeout(timeNow, frameBuffer.NowFrame))
             {
-                if (timeNow < room.StartTime + frameBuffer.NowFrame * LSConstValue.UpdateInterval)
-                {
-                    break;
-                }
-                
-                OneFrameMessages oneFrameMessages = GetOneFrameMessages(self, frameBuffer.NowFrame);
-                room.Update(oneFrameMessages);
-                ++frameBuffer.NowFrame;
+                return;
             }
+            
+            OneFrameMessages oneFrameMessages = GetOneFrameMessages(self, frameBuffer.NowFrame);
+            room.Update(oneFrameMessages);
+            ++frameBuffer.NowFrame;
+
+            LSInput lsInput = new LSInput() { V = self.Input.V, Button = self.Input.Button };
+            clientScene.GetComponent<SessionComponent>().Session.Send(new FrameMessage() {Frame = oneFrameMessages.Frame, Input = lsInput});
         }
 
         private static OneFrameMessages GetOneFrameMessages(this RoomClientUpdater self, int frame)
@@ -52,24 +62,41 @@ namespace ET.Client
         private static OneFrameMessages GetPredictionOneFrameMessage(this RoomClientUpdater self, int frame)
         {
             Room room = self.GetParent<Room>();
-            Scene clientScene = room.GetParent<Scene>();
             OneFrameMessages preFrame = room.FrameBuffer.GetFrame(frame - 1);
             OneFrameMessages predictionFrame  = preFrame != null? MongoHelper.Clone(preFrame) : new OneFrameMessages();
             predictionFrame.Frame = frame;
 
-            PlayerComponent playerComponent = clientScene.GetComponent<PlayerComponent>();
-            long myId = playerComponent.MyId;
-
-            FrameMessage frameMessage = new() { Input = new LSInput(), Frame = frame };
-            frameMessage.Input.V = self.Input.V;
-            frameMessage.Input.Button = self.Input.Button;
-
-            predictionFrame.Inputs[myId] = frameMessage.Input;
+            predictionFrame.Inputs[self.MyId] = new() {V = self.Input.V, Button = self.Input.Button};
             
             room.FrameBuffer.AddFrame(predictionFrame);
             
-            clientScene.GetComponent<SessionComponent>().Session.Send(frameMessage);
+            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];
+                kv.Value.V = preInput.V;
+                kv.Value.Button = preInput.Button;
+            }
 
+            LSInput oldMyInput = frameBuffer.GetFrame(predictionFrame.Frame).Inputs[self.MyId];
+
+            predictionFrame.Inputs[self.MyId] = oldMyInput;
+            
+            predictionFrame.Frame = frame;
             return predictionFrame;
         }
     }

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

@@ -35,6 +35,8 @@ namespace ET.Server
                 }
                 
                 room.Init(room2CStart);
+                
+                room.AddComponent<RoomServerUpdater>();
 
                 RoomMessageHelper.BroadCast(room, room2CStart);
             }

+ 8 - 5
Unity/Assets/Scripts/Codes/Hotfix/Server/LockStep/Map/FrameMessageHandler.cs

@@ -7,13 +7,16 @@ namespace ET.Server
     {
         protected override async ETTask Run(Room room, FrameMessage message)
         {
-            OneFrameMessages oneFrameMessages = room.GetComponent<ServerFrameRecvComponent>().Add(message);
-            if (oneFrameMessages != null)
+            RoomServerUpdater roomServerUpdater = room.GetComponent<RoomServerUpdater>();
+            roomServerUpdater.Add(message);
+
+            if (message.Frame % (1000 / LSConstValue.UpdateInterval) == 0)
             {
-                room.FrameBuffer.AddRealFrame(oneFrameMessages);
+                long nowFrameTime = room.FixedTimeCounter.FrameTime(message.Frame);
+                int diffTime = (int)(nowFrameTime - TimeHelper.ServerFrameTime());
+
+                ActorLocationSenderComponent.Instance.Get(LocationType.GateSession).Send(message.PlayerId, new Room2C_AdjustUpdateTime() {DiffTime = diffTime});
             }
-            
-            RoomMessageHelper.BroadCast(room, oneFrameMessages);
             await ETTask.CompletedTask;
         }
     }

+ 0 - 2
Unity/Assets/Scripts/Codes/Hotfix/Server/LockStep/Map/RoomManagerComponentSystem.cs

@@ -12,8 +12,6 @@ namespace ET.Server
             Room room = self.AddChild<Room>();
             
             room.AddComponent<RoomServerComponent, Match2Map_GetRoom>(request);
-            
-            room.AddComponent<ServerFrameRecvComponent>();
 
             room.LSWorld = new LSWorld(SceneType.LockStepServer);
 

+ 63 - 0
Unity/Assets/Scripts/Codes/Hotfix/Server/LockStep/Room/RoomServerUpdaterSystem.cs

@@ -0,0 +1,63 @@
+using System;
+using System.Collections.Generic;
+
+namespace ET.Server
+{
+    [FriendOf(typeof(RoomServerUpdater))]
+    public static class RoomServerUpdaterSystem
+    {
+        [ObjectSystem]
+        public class UpdateSystem: UpdateSystem<RoomServerUpdater>
+        {
+            protected override void Update(RoomServerUpdater self)
+            {
+                self.Update();
+            }
+        }
+        
+        private static void Update(this RoomServerUpdater self)
+        {
+            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))
+            {
+                return;
+            }
+
+            if (oneFrameMessages.Inputs.Count != LSConstValue.MatchCount)
+            {
+                return;
+            }
+            self.FrameMessages.Remove(oneFrameMessages.Frame);
+            ++self.NowFrame;
+            
+            RoomMessageHelper.BroadCast(room, oneFrameMessages);
+        }
+        
+        
+        public static void Add(this RoomServerUpdater self, FrameMessage message)
+        {
+            if (message.Frame < self.NowFrame)
+            {
+                return;
+            }
+            
+            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;
+        }
+    }
+}

+ 0 - 0
Unity/Assets/Scripts/Codes/Hotfix/Server/LockStep/Room/ServerFrameRecvComponentSystem.cs.meta → Unity/Assets/Scripts/Codes/Hotfix/Server/LockStep/Room/RoomServerUpdaterSystem.cs.meta


+ 0 - 42
Unity/Assets/Scripts/Codes/Hotfix/Server/LockStep/Room/ServerFrameRecvComponentSystem.cs

@@ -1,42 +0,0 @@
-using System;
-using System.Collections.Generic;
-
-namespace ET.Server
-{
-    [FriendOf(typeof(ServerFrameRecvComponent))]
-    public static class ServerFrameRecvComponentSystem
-    {
-        public static OneFrameMessages Add(this ServerFrameRecvComponent self , FrameMessage message)
-        {
-            if (message.Frame < self.NowFrame)
-            {
-                return null;   
-            }
-            
-            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;
-
-            if (oneFrameMessages.Frame > self.NowFrame)
-            {
-                return null;   
-            }
-
-            if (oneFrameMessages.Inputs.Count != LSConstValue.MatchCount)
-            {
-                return null;
-            }
-            self.FrameMessages.Remove(oneFrameMessages.Frame);
-            ++self.NowFrame;
-            return oneFrameMessages;
-        }
-    }
-}

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

@@ -0,0 +1,26 @@
+namespace ET
+{
+    public static class LSHelper
+    {
+        // 回滚
+        public static void Rollback(Room self, int frame)
+        {
+            Log.Debug($"Room Scene roll back to {frame}");
+            self.LSWorld.Dispose();
+            FrameBuffer frameBuffer = self.FrameBuffer;
+            
+            // 回滚
+            byte[] dataBuffer = frameBuffer.GetDate(frame);
+            self.LSWorld = MongoHelper.Deserialize<LSWorld>(dataBuffer);
+
+            // 从回滚的地方重新执行预测的帧
+            for (int i = frameBuffer.RealFrame + 1; i < frameBuffer.NowFrame; ++i)
+            {
+                OneFrameMessages oneFrameMessages = frameBuffer.GetFrame(i);
+                self.Update(oneFrameMessages);
+            }
+            
+            RollbackHelper.Rollback(self);
+        }
+    }
+}

+ 3 - 0
Unity/Assets/Scripts/Codes/Hotfix/Share/LockStep/LSHelper.cs.meta

@@ -0,0 +1,3 @@
+fileFormatVersion: 2
+guid: 08b41d1bd6a844788442e24b957c784d
+timeCreated: 1682325680

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

@@ -3,9 +3,13 @@ namespace ET
     [FriendOf(typeof(Room))]
     public static class RoomSystem
     {
+        
+        
         public static void Init(this Room self, Room2C_Start room2CStart)
         {
             self.StartTime = room2CStart.StartTime;
+            
+            self.FixedTimeCounter = new FixedTimeCounter(self.StartTime, 0, LSConstValue.UpdateInterval);
 
             for (int i = 0; i < room2CStart.UnitInfo.Count; ++i)
             {
@@ -33,16 +37,5 @@ namespace ET
             
             lsWorld.Updater.Update();
         }
-
-        // 回滚
-        public static void Rollback(this Room self, int frame)
-        {
-            Log.Debug($"Room Scene roll back to {frame}");
-            self.LSWorld.Dispose();
-            byte[] dataBuffer = self.FrameBuffer.GetDate(frame);
-            self.LSWorld = MongoHelper.Deserialize<LSWorld>(dataBuffer);
-            
-            RollbackHelper.Rollback(self);
-        }
     }
 }

+ 4 - 4
Unity/Assets/Scripts/Codes/HotfixView/Client/LockStep/LockStepOperaComponentSystem.cs → Unity/Assets/Scripts/Codes/HotfixView/Client/LockStep/LSOperaComponentSystem.cs

@@ -4,12 +4,12 @@ using UnityEngine;
 namespace ET.Client
 {
     [FriendOf(typeof(RoomClientUpdater))]
-    public static class LockStepOperaComponentSystem
+    public static class LSOperaComponentSystem
     {
         [FriendOf(typeof(RoomClientUpdater))]
-        public class UpdateSystem: UpdateSystem<LockStepOperaComponent>
+        public class UpdateSystem: UpdateSystem<LSOperaComponent>
         {
-            protected override void Update(LockStepOperaComponent self)
+            protected override void Update(LSOperaComponent self)
             {
                 TSVector2 v = new();
                 if (Input.GetKey(KeyCode.W))
@@ -33,7 +33,7 @@ namespace ET.Client
                 }
 
                 RoomClientUpdater roomClientUpdater = self.GetParent<Room>().GetComponent<RoomClientUpdater>();
-                roomClientUpdater.Input.V = v;
+                roomClientUpdater.Input.V = v.normalized;
             }
         }
     }

+ 0 - 0
Unity/Assets/Scripts/Codes/HotfixView/Client/LockStep/LockStepOperaComponentSystem.cs.meta → Unity/Assets/Scripts/Codes/HotfixView/Client/LockStep/LSOperaComponentSystem.cs.meta


+ 1 - 1
Unity/Assets/Scripts/Codes/HotfixView/Client/LockStep/LockStepSceneInitFinish_Finish.cs

@@ -9,7 +9,7 @@ namespace ET.Client
             
             room.AddComponent<CameraComponent>();
             
-            room.AddComponent<LockStepOperaComponent>();
+            room.AddComponent<LSOperaComponent>();
             await ETTask.CompletedTask;
         }
     }

+ 2 - 0
Unity/Assets/Scripts/Codes/Model/Client/LockStep/RoomClientUpdater.cs

@@ -6,5 +6,7 @@ namespace ET.Client
     public class RoomClientUpdater: Entity, IAwake, IUpdate
     {
         public LSInput Input = new();
+        
+        public long MyId;
     }
 }

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

@@ -119,6 +119,15 @@ namespace ET
 		public Dictionary<long, LSInput> Inputs { get; set; }
 	}
 
+	[Message(LockStepOuter.Room2C_AdjustUpdateTime)]
+	[ProtoContract]
+	public partial class Room2C_AdjustUpdateTime: ProtoObject, IActorMessage
+	{
+		[ProtoMember(1)]
+		public int DiffTime { get; set; }
+
+	}
+
 	public static class LockStepOuter
 	{
 		 public const ushort C2G_Match = 11002;
@@ -130,5 +139,6 @@ namespace ET
 		 public const ushort LSInput = 11008;
 		 public const ushort FrameMessage = 11009;
 		 public const ushort OneFrameMessages = 11010;
+		 public const ushort Room2C_AdjustUpdateTime = 11011;
 	}
 }

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

@@ -119,6 +119,15 @@ namespace ET
 		public Dictionary<long, LSInput> Inputs { get; set; }
 	}
 
+	[Message(LockStepOuter.Room2C_AdjustUpdateTime)]
+	[ProtoContract]
+	public partial class Room2C_AdjustUpdateTime: ProtoObject, IActorMessage
+	{
+		[ProtoMember(1)]
+		public int DiffTime { get; set; }
+
+	}
+
 	public static class LockStepOuter
 	{
 		 public const ushort C2G_Match = 11002;
@@ -130,5 +139,6 @@ namespace ET
 		 public const ushort LSInput = 11008;
 		 public const ushort FrameMessage = 11009;
 		 public const ushort OneFrameMessages = 11010;
+		 public const ushort Room2C_AdjustUpdateTime = 11011;
 	}
 }

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

@@ -119,6 +119,15 @@ namespace ET
 		public Dictionary<long, LSInput> Inputs { get; set; }
 	}
 
+	[Message(LockStepOuter.Room2C_AdjustUpdateTime)]
+	[ProtoContract]
+	public partial class Room2C_AdjustUpdateTime: ProtoObject, IActorMessage
+	{
+		[ProtoMember(1)]
+		public int DiffTime { get; set; }
+
+	}
+
 	public static class LockStepOuter
 	{
 		 public const ushort C2G_Match = 11002;
@@ -130,5 +139,6 @@ namespace ET
 		 public const ushort LSInput = 11008;
 		 public const ushort FrameMessage = 11009;
 		 public const ushort OneFrameMessages = 11010;
+		 public const ushort Room2C_AdjustUpdateTime = 11011;
 	}
 }

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

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

+ 0 - 0
Unity/Assets/Scripts/Codes/Model/Server/LockStep/Room/ServerFrameRecvComponent.cs.meta → Unity/Assets/Scripts/Codes/Model/Server/LockStep/Room/RoomServerUpdater.cs.meta


+ 38 - 0
Unity/Assets/Scripts/Codes/Model/Share/LockStep/FixedTimeCounter.cs

@@ -0,0 +1,38 @@
+namespace ET
+{
+    public class FixedTimeCounter
+    {
+        private long startTime;
+        private long startFrame;
+        public int Interval { get; private set; }
+
+        public FixedTimeCounter(long startTime, long startFrame, int interval)
+        {
+            this.startTime = startTime;
+            this.startFrame = startFrame;
+            this.Interval = interval;
+        }
+
+        public bool IsTimeout(long time, int frame)
+        {
+            if (time > this.startTime + (frame - this.startFrame) * this.Interval)
+            {
+                return true;
+            }
+
+            return false;
+        }
+        
+        public void ChangeInterval(int interval, int frame)
+        {
+            this.startTime += (frame - this.startFrame) * this.Interval;
+            this.startFrame = frame;
+            this.Interval = interval;
+        }
+
+        public long FrameTime(int frame)
+        {
+            return this.startTime + (frame - this.startFrame) * this.Interval;
+        }
+    }
+}

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

@@ -0,0 +1,3 @@
+fileFormatVersion: 2
+guid: a78339a190b64d92ba482cd00b239f52
+timeCreated: 1682422635

+ 2 - 4
Unity/Assets/Scripts/Codes/Model/Share/LockStep/FrameBuffer.cs

@@ -8,12 +8,10 @@ namespace ET
         public int NowFrame { get; set; }
 
         public int RealFrame { get; set; } = -1;
-
-        public int PredictionCount { get; set; } = 3;
         
         private const int TotalFrameCount = 128;
         
-        private readonly List<OneFrameMessages> messageBuffer = new List<OneFrameMessages>(TotalFrameCount);
+        private readonly List<OneFrameMessages> messageBuffer = new(TotalFrameCount);
         private readonly List<byte[]> dataBuffer = new(TotalFrameCount);
 
         public FrameBuffer()
@@ -47,7 +45,7 @@ namespace ET
                 return null;
             }
 
-            if (frame > this.RealFrame + this.PredictionCount)
+            if (frame > this.RealFrame && frame > this.NowFrame)
             {
                 return null;
             }

+ 1 - 1
Unity/Assets/Scripts/Codes/Model/Share/LockStep/LSConstValue.cs

@@ -3,6 +3,6 @@ namespace ET
     public static class LSConstValue
     {
         public const int MatchCount = 1;
-        public const int UpdateInterval = 60;
+        public const int UpdateInterval = 50;
     }
 }

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

@@ -28,5 +28,7 @@ namespace ET
         public long StartTime { get; set; }
 
         public FrameBuffer FrameBuffer { get; } = new();
+
+        public FixedTimeCounter FixedTimeCounter { get; set; }
     }
 }

+ 7 - 0
Unity/Assets/Scripts/Codes/ModelView/Client/LockStep/LSOperaComponent.cs

@@ -0,0 +1,7 @@
+namespace ET
+{
+    [ComponentOf(typeof(Room))]
+    public class LSOperaComponent: Entity, IAwake, IUpdate
+    {
+    }
+}

+ 0 - 0
Unity/Assets/Scripts/Codes/ModelView/Client/LockStep/LockStepOperaComponent.cs.meta → Unity/Assets/Scripts/Codes/ModelView/Client/LockStep/LSOperaComponent.cs.meta


+ 0 - 7
Unity/Assets/Scripts/Codes/ModelView/Client/LockStep/LockStepOperaComponent.cs

@@ -1,7 +0,0 @@
-namespace ET
-{
-    [ComponentOf(typeof(Room))]
-    public class LockStepOperaComponent: Entity, IAwake, IUpdate
-    {
-    }
-}