فهرست منبع

基本实现帧同步功能

tanghai 2 سال پیش
والد
کامیت
a096f70db1

+ 1 - 1
Unity/Assets/Scripts/Editor/BuildEditor/BuildEditor.cs

@@ -81,7 +81,7 @@ namespace ET
 			{
 				case BuildType.None:
 				case BuildType.Debug:
-					this.buildOptions = BuildOptions.Development | BuildOptions.ConnectWithProfiler;
+					this.buildOptions = BuildOptions.BuildScriptsOnly;
 					break;
 				case BuildType.Release:
 					this.buildOptions = BuildOptions.BuildScriptsOnly;

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

@@ -21,16 +21,11 @@ namespace ET.Client
             ++frameBuffer.RealFrame;
             if (message != predictionMessage)
             {
-                Log.Debug($"recv diff:");
-                Log.Debug($"recv diff1----: {message.ToJson()}");
-                Log.Debug($"recv diff2----: {predictionMessage.ToJson()}");
-                
                 message.CopyTo(predictionMessage);
                 // 回滚到frameBuffer.RealFrame
                 LSHelper.Rollback(room, frameBuffer.RealFrame);
             }
-            
-            
+
             await ETTask.CompletedTask;
         }
     }

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

@@ -6,7 +6,7 @@ namespace ET.Client
         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;
+            int newInterval = (1000 + (message.DiffTime - LSConstValue.UpdateInterval)) * LSConstValue.UpdateInterval / 1000;
 
             if (newInterval < 40)
             {
@@ -18,7 +18,7 @@ namespace ET.Client
                 newInterval = 66;
             }
             
-            room.FixedTimeCounter.ChangeInterval(newInterval, room.FrameBuffer.PredictionFrame - 1);
+            room.FixedTimeCounter.ChangeInterval(newInterval, room.FrameBuffer.PredictionFrame);
             await ETTask.CompletedTask;
         }
     }

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

@@ -31,14 +31,15 @@ namespace ET.Client
             FrameBuffer frameBuffer = room.FrameBuffer;
             long timeNow = TimeHelper.ServerFrameTime();
             Scene clientScene = room.GetParent<Scene>();
-            if (timeNow < room.FixedTimeCounter.FrameTime(frameBuffer.PredictionFrame))
+            
+            if (timeNow < room.FixedTimeCounter.FrameTime(frameBuffer.PredictionFrame + 1))
             {
                 return;
             }
-            
+            ++frameBuffer.PredictionFrame;
             OneFrameMessages oneFrameMessages = GetOneFrameMessages(self, frameBuffer.PredictionFrame);
             room.Update(oneFrameMessages, frameBuffer.PredictionFrame);
-            ++frameBuffer.PredictionFrame;
+            
 
             FrameMessage frameMessage = NetServices.Instance.FetchMessage<FrameMessage>();
             frameMessage.Frame = oneFrameMessages.Frame;
@@ -65,8 +66,8 @@ namespace ET.Client
         {
             Room room = self.GetParent<Room>();
             OneFrameMessages predictionFrame = room.FrameBuffer.GetFrame(frame);
-            OneFrameMessages preFrame = room.FrameBuffer.GetFrame(frame - 1);
-            preFrame?.CopyTo(predictionFrame);
+            OneFrameMessages realFrame = room.FrameBuffer.GetFrame(room.FrameBuffer.RealFrame);
+            realFrame?.CopyTo(predictionFrame);
             predictionFrame.Frame = frame;
             predictionFrame.Inputs[self.MyId] = self.Input;
             

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

@@ -10,9 +10,11 @@ namespace ET.Server
             FrameBuffer frameBuffer = room.FrameBuffer;
             if (message.Frame < frameBuffer.RealFrame)  // 小于RealFrame,丢弃
             {
+                Log.Warning($"FrameMessage discard: {message}");
                 return;
             }
             OneFrameMessages oneFrameMessages = frameBuffer.GetFrame(message.Frame);
+            oneFrameMessages.Frame = message.Frame;
             oneFrameMessages.Inputs[message.PlayerId] = message.Input;
 
             if (message.Frame % (1000 / LSConstValue.UpdateInterval) == 0)

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

@@ -29,6 +29,7 @@ namespace ET.Server
             }
             
             OneFrameMessages oneFrameMessages = frameBuffer.GetFrame(frame);
+            oneFrameMessages.Frame = frame;
             if (oneFrameMessages.Inputs.Count != LSConstValue.MatchCount)
             {
                 return;

+ 6 - 8
Unity/Assets/Scripts/Hotfix/Share/LockStep/LSHelper.cs

@@ -7,7 +7,7 @@ namespace ET
         // 回滚
         public static void Rollback(Room room, int frame)
         {
-            Log.Debug($"Room Scene roll back start {frame}");
+            Log.Debug($"roll back start {frame}");
             room.LSWorld.Dispose();
             FrameBuffer frameBuffer = room.FrameBuffer;
             
@@ -19,7 +19,7 @@ namespace ET
 
             
             // 重新执行预测的帧
-            for (int i = frameBuffer.RealFrame + 1; i < frameBuffer.PredictionFrame; ++i)
+            for (int i = frameBuffer.RealFrame + 1; i <= frameBuffer.PredictionFrame; ++i)
             {
                 OneFrameMessages oneFrameMessages = frameBuffer.GetFrame(i);
                 CopyOtherInputsTo(room, realFrameMessage, oneFrameMessages); // 重新预测剩下预测过的消息
@@ -28,22 +28,20 @@ namespace ET
             
             RollbackHelper.Rollback(room);
             
-            Log.Debug($"Room Scene roll back finish {frame}");
+            Log.Debug($"roll back finish {frame}");
         }
-        
-        public static void CopyOtherInputsTo(Room room, OneFrameMessages from, OneFrameMessages to)
+
+        private static void CopyOtherInputsTo(Room room, OneFrameMessages from, OneFrameMessages to)
         {
             long myId = room.GetComponent<RoomClientUpdater>().MyId;
-            to.Inputs.Clear();
             foreach (var kv in from.Inputs)
             {
                 if (kv.Key == myId)
                 {
                     continue;
                 }
-                to.Inputs.Add(kv.Key, kv.Value);
+                to.Inputs[kv.Key] = kv.Value;
             }
-            Log.Debug($"copy inputs to: {to.ToJson()}");
         }
     }
 }

+ 3 - 6
Unity/Assets/Scripts/Hotfix/Share/LockStep/RoomSystem.cs

@@ -22,12 +22,9 @@ namespace ET
 
         public static void Update(this Room self, OneFrameMessages oneFrameMessages, int frame)
         {
-            if (frame == self.FrameBuffer.RealFrame + 1)
-            {
-                // 保存当前帧场景数据
-                self.FrameBuffer.SaveLSWorld(frame, self.LSWorld);
-            }
-
+            // 保存当前帧场景数据
+            self.FrameBuffer.SaveLSWorld(frame, self.LSWorld);
+            
             // 设置输入到每个LSUnit身上
             LSWorld lsWorld = self.LSWorld;
             LSUnitComponent unitComponent = lsWorld.GetComponent<LSUnitComponent>();

+ 18 - 0
Unity/Assets/Scripts/HotfixView/Client/LockStep/LSUnitViewComponentSystem.cs

@@ -14,6 +14,24 @@ namespace ET.Client
             }
         }
         
+        public class RollbackSystem: RollbackSystem<LSUnitViewComponent>
+        {
+            protected override void Rollback(LSUnitViewComponent self)
+            {
+                LSWorld lsWorld = self.GetParent<Room>().LSWorld;
+                foreach (LSUnitView child in self.Children.Values)
+                {
+                    LSUnit unit = lsWorld.Get(child.Id) as LSUnit;
+
+                    Vector3 pos = child.Transform.position;
+                    Vector3 to = unit.Position.ToVector();
+                    float t = (to - pos).magnitude / 9f;
+
+                    child.Transform.position = pos;
+                }
+            }
+        }
+        
         public class UpdateSystem: UpdateSystem<LSUnitViewComponent>
         {
             protected override void Update(LSUnitViewComponent self)

+ 1 - 1
Unity/Assets/Scripts/Loader/Plugins/HybridCLR/HybridCLRHelper.cs

@@ -12,7 +12,7 @@ namespace ET
             foreach (var kv in dictionary)
             {
                 byte[] bytes = (kv.Value as TextAsset).bytes;
-                RuntimeApi.LoadMetadataForAOTAssembly(bytes, HomologousImageMode.Consistent);
+                RuntimeApi.LoadMetadataForAOTAssembly(bytes, HomologousImageMode.SuperSet);
             }
         }
     }

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

@@ -6,7 +6,7 @@ namespace ET
 {
     public class FrameBuffer
     {
-        public int PredictionFrame { get; set; }
+        public int PredictionFrame { get; set; } = -1;
 
         public int RealFrame { get; set; } = -1;
         
@@ -31,7 +31,6 @@ namespace ET
                 return null;
             }
             OneFrameMessages oneFrameMessages = this.messageBuffer[frame % TotalFrameCount];
-            oneFrameMessages.Frame = frame;
             return oneFrameMessages;
         }
 

+ 1 - 1
Unity/Assets/Scripts/ModelView/Client/LockStep/UnitFView/LSUnitViewComponent.cs

@@ -1,7 +1,7 @@
 namespace ET
 {
 	[ComponentOf(typeof(Room))]
-	public class LSUnitViewComponent: Entity, IAwake, IDestroy, IUpdate
+	public class LSUnitViewComponent: Entity, IAwake, IDestroy, IUpdate, IRollback
 	{
 		public long MyId;
 	}