Răsfoiți Sursa

追帧的情况,限制逻辑层一帧只能追5ms

tanghai 2 ani în urmă
părinte
comite
333049144d

+ 29 - 19
Unity/Assets/Scripts/Hotfix/Client/LockStep/LSClientUpdaterSystem.cs

@@ -26,29 +26,39 @@ namespace ET.Client
         private static void Update(this LSClientUpdater self)
         {
             Room room = self.GetParent<Room>();
-            long timeNow = TimeHelper.ServerFrameTime();
+            long timeNow = TimeHelper.ServerNow();
             Scene clientScene = room.GetParent<Scene>();
-            
-            if (timeNow < room.FixedTimeCounter.FrameTime(room.PredictionFrame + 1))
-            {
-                return;
-            }
 
-            // 最多只预测5帧
-            if (room.PredictionFrame - room.AuthorityFrame > 5)
+            int i = 0;
+            while (true)
             {
-                return;
-            }
-            
-            ++room.PredictionFrame;
-            OneFrameInputs oneFrameInputs = self.GetOneFrameMessages(room.PredictionFrame);
-            room.Update(oneFrameInputs, room.PredictionFrame);
-            
+                if (timeNow < room.FixedTimeCounter.FrameTime(room.PredictionFrame + 1))
+                {
+                    return;
+                }
+
+                // 最多只预测5帧
+                if (room.PredictionFrame - room.AuthorityFrame > 5)
+                {
+                    return;
+                }
 
-            FrameMessage frameMessage = NetServices.Instance.FetchMessage<FrameMessage>();
-            frameMessage.Frame = room.PredictionFrame;
-            frameMessage.Input = self.Input;
-            clientScene.GetComponent<SessionComponent>().Session.Send(frameMessage);
+                ++room.PredictionFrame;
+                OneFrameInputs oneFrameInputs = self.GetOneFrameMessages(room.PredictionFrame);
+                room.Update(oneFrameInputs, room.PredictionFrame);
+                room.SpeedMultiply = ++i;
+
+                FrameMessage frameMessage = NetServices.Instance.FetchMessage<FrameMessage>();
+                frameMessage.Frame = room.PredictionFrame;
+                frameMessage.Input = self.Input;
+                clientScene.GetComponent<SessionComponent>().Session.Send(frameMessage);
+                
+                long timeNow2 = TimeHelper.ServerNow();
+                if (timeNow2 - timeNow > 5)
+                {
+                    break;
+                }
+            }
         }
 
         private static OneFrameInputs GetOneFrameMessages(this LSClientUpdater self, int frame)

+ 10 - 9
Unity/Assets/Scripts/Hotfix/Client/LockStep/LSReplayUpdaterSystem.cs

@@ -17,10 +17,10 @@ namespace ET.Client
         private static void Update(this LSReplayUpdater self)
         {
             Room room = self.GetParent<Room>();
-            long timeNow = TimeHelper.ServerFrameTime();
+            long timeNow = TimeHelper.ServerNow();
 
-            int old = room.AuthorityFrame;
-            for (int i = 0; i < 10; ++i)
+            int i = 0;
+            while (true)
             {
                 if (room.AuthorityFrame + 1 >= room.Replay.FrameInputs.Count)
                 {
@@ -37,12 +37,13 @@ namespace ET.Client
                 OneFrameInputs oneFrameInputs = room.Replay.FrameInputs[room.AuthorityFrame];
             
                 room.Update(oneFrameInputs, room.AuthorityFrame);
-                room.SpeedMultiply = i + 1;
-            }
-
-            if (room.AuthorityFrame > old)
-            {
-                Log.Debug($"111111111111111111 replay update: {old} {room.AuthorityFrame}");
+                room.SpeedMultiply = ++i;
+                
+                long timeNow2 = TimeHelper.ServerNow();
+                if (timeNow2 - timeNow > 5)
+                {
+                    break;
+                }
             }
         }
     }

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

@@ -50,7 +50,6 @@ namespace ET
             {
                 OneFrameInputs oneFrameInputs = frameBuffer.FrameInputs(i);
                 LSHelper.CopyOtherInputsTo(room, authorityFrameInput, oneFrameInputs); // 重新预测消息
-                room.Update(oneFrameInputs, i);
             }
             
             RunRollbackSystem(room);