Kaynağa Gözat

预测回滚跑通

tanghai 2 yıl önce
ebeveyn
işleme
51db1d97f7
30 değiştirilmiş dosya ile 156 ekleme ve 118 silme
  1. 2 2
      Unity/Assets/Config/Proto/LockStepOuter_C_11001.proto
  2. 11 5
      Unity/Assets/Scripts/Codes/Hotfix/Client/LockStep/BattleSceneClientUpdaterSystem.cs
  3. 1 1
      Unity/Assets/Scripts/Codes/Hotfix/Client/LockStep/LSSceneChangeHelper.cs
  4. 28 3
      Unity/Assets/Scripts/Codes/Hotfix/Client/LockStep/OneFrameMessagesHandler.cs
  5. 2 2
      Unity/Assets/Scripts/Codes/Hotfix/Client/LockStep/Room2C_EnterMapHandler.cs
  6. 1 1
      Unity/Assets/Scripts/Codes/Hotfix/Server/Demo/Helper/SceneFactory.cs
  7. 25 0
      Unity/Assets/Scripts/Codes/Hotfix/Server/LockStep/Map/BattleSceneManagerComponentSystem.cs
  8. 0 0
      Unity/Assets/Scripts/Codes/Hotfix/Server/LockStep/Map/BattleSceneManagerComponentSystem.cs.meta
  9. 8 8
      Unity/Assets/Scripts/Codes/Hotfix/Server/LockStep/Map/C2Room_ChangeSceneFinishHandler.cs
  10. 5 6
      Unity/Assets/Scripts/Codes/Hotfix/Server/LockStep/Map/FrameMessageHandler.cs
  11. 3 3
      Unity/Assets/Scripts/Codes/Hotfix/Server/LockStep/Map/Match2Map_GetRoomHandler.cs
  12. 0 25
      Unity/Assets/Scripts/Codes/Hotfix/Server/LockStep/Map/RoomManagerComponentSystem.cs
  13. 2 2
      Unity/Assets/Scripts/Codes/Hotfix/Server/LockStep/Map/RoomMessageHelper.cs
  14. 1 1
      Unity/Assets/Scripts/Codes/Hotfix/Server/Module/Actor/ActorMessageDispatcherComponentSystem.cs
  15. 7 7
      Unity/Assets/Scripts/Codes/Hotfix/Share/LockStep/BattleSceneSystem.cs
  16. 1 1
      Unity/Assets/Scripts/Codes/Model/Client/LockStep/WaitType.cs
  17. 6 6
      Unity/Assets/Scripts/Codes/Model/Generate/Client/Message/LockStepOuter_C_11001.cs
  18. 6 6
      Unity/Assets/Scripts/Codes/Model/Generate/ClientServer/Message/LockStepOuter_C_11001.cs
  19. 6 6
      Unity/Assets/Scripts/Codes/Model/Generate/Server/Message/LockStepOuter_C_11001.cs
  20. 1 1
      Unity/Assets/Scripts/Codes/Model/Server/LockStep/Map/BattleSceneManagerComponent.cs
  21. 0 0
      Unity/Assets/Scripts/Codes/Model/Server/LockStep/Map/BattleSceneManagerComponent.cs.meta
  22. 1 1
      Unity/Assets/Scripts/Codes/Model/Server/LockStep/Map/RoomServerComponent.cs
  23. 1 1
      Unity/Assets/Scripts/Codes/Model/Server/LockStep/Room/ServerFrameRecvComponent.cs
  24. 2 1
      Unity/Assets/Scripts/Codes/Model/Share/LockStep/BattleScene.cs
  25. 13 21
      Unity/Assets/Scripts/Codes/Model/Share/LockStep/FrameBuffer.cs
  26. 1 1
      Unity/Assets/Scripts/Codes/Model/Share/LockStep/LSConstValue.cs
  27. 15 4
      Unity/Assets/Scripts/Codes/Model/Share/LockStep/OneFrameMessage.cs
  28. 5 0
      Unity/Assets/Scripts/Core/Module/Entity/SceneHelper.cs
  29. 1 2
      Unity/Assets/Scripts/Core/Module/Entity/SceneType.cs
  30. 1 1
      Unity/ProjectSettings/ProjectSettings.asset

+ 2 - 2
Unity/Assets/Config/Proto/LockStepOuter_C_11001.proto

@@ -23,7 +23,7 @@ message Match2G_NotifyMatchSuccess // IActorLocationMessage
 }
 }
 
 
 // 客户端通知房间切换场景完成
 // 客户端通知房间切换场景完成
-message C2Room_ChangeSceneFinish // IActorRoom
+message C2Battle_ChangeSceneFinish // IActorRoom
 {
 {
 	int64 PlayerId = 1;
 	int64 PlayerId = 1;
 }
 }
@@ -36,7 +36,7 @@ message LockStepUnitInfo
 }
 }
 
 
 // 房间通知客户端进入战斗
 // 房间通知客户端进入战斗
-message Room2C_BattleStart // IActorMessage
+message Battle2C_BattleStart // IActorMessage
 {
 {
 	int64 StartTime = 1;
 	int64 StartTime = 1;
 	repeated LockStepUnitInfo UnitInfo = 2;
 	repeated LockStepUnitInfo UnitInfo = 2;

+ 11 - 5
Unity/Assets/Scripts/Codes/Hotfix/Client/LockStep/BattleSceneClientUpdaterSystem.cs

@@ -22,7 +22,12 @@ namespace ET.Client
             FrameBuffer frameBuffer = battleScene.FrameBuffer;
             FrameBuffer frameBuffer = battleScene.FrameBuffer;
 
 
             long timeNow = TimeHelper.ServerFrameTime();
             long timeNow = TimeHelper.ServerFrameTime();
-            if (timeNow < battleScene.StartTime + battleScene.FrameBuffer.NowFrame * LSConstValue.UpdateInterval)
+            if (timeNow < battleScene.StartTime + frameBuffer.NowFrame * LSConstValue.UpdateInterval)
+            {
+                return;
+            }
+
+            if (frameBuffer.NowFrame > frameBuffer.RealFrame + frameBuffer.PredictionCount)
             {
             {
                 return;
                 return;
             }
             }
@@ -50,11 +55,12 @@ namespace ET.Client
         private static OneFrameMessages GetPredictionOneFrameMessage(this BattleSceneClientUpdater self, int frame)
         private static OneFrameMessages GetPredictionOneFrameMessage(this BattleSceneClientUpdater self, int frame)
         {
         {
             BattleScene battleScene = self.GetParent<BattleScene>();
             BattleScene battleScene = self.GetParent<BattleScene>();
+            Scene clientScene = battleScene.GetParent<Scene>();
             OneFrameMessages preFrame = battleScene.FrameBuffer.GetFrame(frame - 1);
             OneFrameMessages preFrame = battleScene.FrameBuffer.GetFrame(frame - 1);
             OneFrameMessages predictionFrame  = preFrame != null? MongoHelper.Clone(preFrame) : new OneFrameMessages();
             OneFrameMessages predictionFrame  = preFrame != null? MongoHelper.Clone(preFrame) : new OneFrameMessages();
             predictionFrame.Frame = frame;
             predictionFrame.Frame = frame;
 
 
-            PlayerComponent playerComponent = battleScene.GetParent<Scene>().GetComponent<PlayerComponent>();
+            PlayerComponent playerComponent = clientScene.GetComponent<PlayerComponent>();
             long myId = playerComponent.MyId;
             long myId = playerComponent.MyId;
 
 
             FrameMessage frameMessage = new() { InputInfo = new LSInputInfo(), Frame = frame };
             FrameMessage frameMessage = new() { InputInfo = new LSInputInfo(), Frame = frame };
@@ -63,10 +69,10 @@ namespace ET.Client
 
 
             predictionFrame.InputInfos[myId] = frameMessage.InputInfo;
             predictionFrame.InputInfos[myId] = frameMessage.InputInfo;
             
             
+            battleScene.FrameBuffer.AddFrame(predictionFrame);
             
             
-            self.Parent.GetParent<Scene>().GetComponent<SessionComponent>().Session.Send(frameMessage);
-            
-            
+            clientScene.GetComponent<SessionComponent>().Session.Send(frameMessage);
+
             return predictionFrame;
             return predictionFrame;
         }
         }
     }
     }

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

@@ -14,7 +14,7 @@ namespace ET.Client
             // 等待表现层订阅的事件完成
             // 等待表现层订阅的事件完成
             await EventSystem.Instance.PublishAsync(clientScene, new EventType.LockStepSceneChangeStart());
             await EventSystem.Instance.PublishAsync(clientScene, new EventType.LockStepSceneChangeStart());
 
 
-            clientScene.GetComponent<SessionComponent>().Session.Send(new C2Room_ChangeSceneFinish());
+            clientScene.GetComponent<SessionComponent>().Session.Send(new C2Battle_ChangeSceneFinish());
             
             
             // 等待Room2C_EnterMap消息
             // 等待Room2C_EnterMap消息
             WaitType.Wait_Room2C_EnterMap waitRoom2CEnterMap = await clientScene.GetComponent<ObjectWait>().Wait<WaitType.Wait_Room2C_EnterMap>();
             WaitType.Wait_Room2C_EnterMap waitRoom2CEnterMap = await clientScene.GetComponent<ObjectWait>().Wait<WaitType.Wait_Room2C_EnterMap>();

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

@@ -1,3 +1,5 @@
+using System;
+
 namespace ET.Client
 namespace ET.Client
 {
 {
     [MessageHandler(SceneType.Client)]
     [MessageHandler(SceneType.Client)]
@@ -5,11 +7,34 @@ namespace ET.Client
     {
     {
         protected override async ETTask Run(Session session, OneFrameMessages message)
         protected override async ETTask Run(Session session, OneFrameMessages message)
         {
         {
-            FrameBuffer frameBuffer = session.DomainScene().GetComponent<BattleScene>().FrameBuffer;
-            frameBuffer.AddRealFrame(message);
+            BattleScene battleScene = session.DomainScene().GetComponent<BattleScene>();
+            FrameBuffer frameBuffer = battleScene.FrameBuffer;
+            if (message.Frame != frameBuffer.RealFrame + 1)
+            {
+                throw new Exception($"recv oneframeMessage frame error: {message.Frame} {frameBuffer.RealFrame}");
+            }
+
+            // 服务端返回来的消息,跟预测消息对比
+            OneFrameMessages predictionMessage = frameBuffer.GetFrame(message.Frame);
             
             
+            if (message != predictionMessage)
+            {
+                // 回滚到frameBuffer.RealFrame
+                battleScene.Rollback(frameBuffer.RealFrame);
+                frameBuffer.AddRealFrame(message);
+            }
+            else
+            {
+                frameBuffer.AddRealFrame(message);
+            }
+
             PingComponent pingComponent = session.GetComponent<PingComponent>();
             PingComponent pingComponent = session.GetComponent<PingComponent>();
-            frameBuffer.PredictionCount = (int) (pingComponent.Ping / 2f / LSConstValue.UpdateInterval) + 1;
+            int prediction = (int) (pingComponent.Ping / 2f / LSConstValue.UpdateInterval) + 1;
+            if (prediction < 3)
+            {
+                prediction = 3;
+            }
+            frameBuffer.PredictionCount = prediction;
             await ETTask.CompletedTask;
             await ETTask.CompletedTask;
         }
         }
     }
     }

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

@@ -1,9 +1,9 @@
 namespace ET.Client
 namespace ET.Client
 {
 {
     [MessageHandler(SceneType.Client)]
     [MessageHandler(SceneType.Client)]
-    public class Room2C_EnterMapHandler: AMHandler<Room2C_BattleStart>
+    public class Room2C_EnterMapHandler: AMHandler<Battle2C_BattleStart>
     {
     {
-        protected override async ETTask Run(Session session, Room2C_BattleStart message)
+        protected override async ETTask Run(Session session, Battle2C_BattleStart message)
         {
         {
             session.DomainScene().GetComponent<ObjectWait>().Notify(new WaitType.Wait_Room2C_EnterMap() {Message = message});
             session.DomainScene().GetComponent<ObjectWait>().Notify(new WaitType.Wait_Room2C_EnterMap() {Message = message});
             await ETTask.CompletedTask;
             await ETTask.CompletedTask;

+ 1 - 1
Unity/Assets/Scripts/Codes/Hotfix/Server/Demo/Helper/SceneFactory.cs

@@ -34,7 +34,7 @@ namespace ET.Server
                 case SceneType.Map:
                 case SceneType.Map:
                     scene.AddComponent<UnitComponent>();
                     scene.AddComponent<UnitComponent>();
                     scene.AddComponent<AOIManagerComponent>();
                     scene.AddComponent<AOIManagerComponent>();
-                    scene.AddComponent<RoomManagerComponent>();
+                    scene.AddComponent<BattleSceneManagerComponent>();
                     break;
                     break;
                 case SceneType.Location:
                 case SceneType.Location:
                     scene.AddComponent<LocationManagerComoponent>();
                     scene.AddComponent<LocationManagerComoponent>();

+ 25 - 0
Unity/Assets/Scripts/Codes/Hotfix/Server/LockStep/Map/BattleSceneManagerComponentSystem.cs

@@ -0,0 +1,25 @@
+using System;
+
+namespace ET.Server
+{
+
+    public static class BattleSceneManagerComponentSystem
+    {
+        public static async ETTask<BattleScene> CreateBattleScene(this BattleSceneManagerComponent self, Match2Map_GetRoom request)
+        {
+            await ETTask.CompletedTask;
+            
+            BattleScene battleScene = self.AddChild<BattleScene>();
+            
+            battleScene.AddComponent<RoomServerComponent, Match2Map_GetRoom>(request);
+            
+            battleScene.AddComponent<ServerFrameRecvComponent>();
+
+            battleScene.LSWorld = new LSWorld(SceneType.LockStepClient);
+
+            battleScene.AddComponent<MailBoxComponent, MailboxType>(MailboxType.UnOrderMessageDispatcher);
+            
+            return battleScene;
+        }
+    }
+}

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


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

@@ -3,14 +3,14 @@ using TrueSync;
 
 
 namespace ET.Server
 namespace ET.Server
 {
 {
-    [ActorMessageHandler(SceneType.Room)]
+    [ActorMessageHandler(SceneType.Battle)]
     [FriendOf(typeof (RoomServerComponent))]
     [FriendOf(typeof (RoomServerComponent))]
-    public class C2Room_ChangeSceneFinishHandler: AMActorHandler<Scene, C2Room_ChangeSceneFinish>
+    public class C2Room_ChangeSceneFinishHandler: AMActorHandler<BattleScene, C2Battle_ChangeSceneFinish>
     {
     {
-        protected override async ETTask Run(Scene roomScene, C2Room_ChangeSceneFinish message)
+        protected override async ETTask Run(BattleScene battleScene, C2Battle_ChangeSceneFinish message)
         {
         {
-            RoomServerComponent roomServerComponent = roomScene.GetComponent<RoomServerComponent>();
-            RoomPlayer roomPlayer = roomScene.GetComponent<RoomServerComponent>().GetChild<RoomPlayer>(message.PlayerId);
+            RoomServerComponent roomServerComponent = battleScene.GetComponent<RoomServerComponent>();
+            RoomPlayer roomPlayer = battleScene.GetComponent<RoomServerComponent>().GetChild<RoomPlayer>(message.PlayerId);
             roomPlayer.IsJoinRoom = true;
             roomPlayer.IsJoinRoom = true;
             roomServerComponent.AlreadyJoinRoomCount++;
             roomServerComponent.AlreadyJoinRoomCount++;
 
 
@@ -23,7 +23,7 @@ namespace ET.Server
             {
             {
                 await TimerComponent.Instance.WaitAsync(1000);
                 await TimerComponent.Instance.WaitAsync(1000);
 
 
-                Room2C_BattleStart room2CBattleStart = new() {StartTime = TimeHelper.ServerFrameTime()};
+                Battle2C_BattleStart room2CBattleStart = new() {StartTime = TimeHelper.ServerFrameTime()};
                 foreach (RoomPlayer rp in roomServerComponent.Children.Values)
                 foreach (RoomPlayer rp in roomServerComponent.Children.Values)
                 {
                 {
                     room2CBattleStart.UnitInfo.Add(new LockStepUnitInfo()
                     room2CBattleStart.UnitInfo.Add(new LockStepUnitInfo()
@@ -34,9 +34,9 @@ namespace ET.Server
                     });
                     });
                 }
                 }
                 
                 
-                roomScene.GetComponent<BattleScene>().Init(room2CBattleStart);
+                battleScene.Init(room2CBattleStart);
 
 
-                RoomMessageHelper.BroadCast(roomScene, room2CBattleStart);
+                RoomMessageHelper.BroadCast(battleScene, room2CBattleStart);
             }
             }
 
 
             await ETTask.CompletedTask;
             await ETTask.CompletedTask;

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

@@ -2,19 +2,18 @@ using System.Collections.Generic;
 
 
 namespace ET.Server
 namespace ET.Server
 {
 {
-    [ActorMessageHandler(SceneType.Room)]
-    public class FrameMessageHandler: AMActorHandler<Scene, FrameMessage>
+    [ActorMessageHandler(SceneType.Battle)]
+    public class FrameMessageHandler: AMActorHandler<BattleScene, FrameMessage>
     {
     {
-        protected override async ETTask Run(Scene roomScene, FrameMessage message)
+        protected override async ETTask Run(BattleScene battleScene, FrameMessage message)
         {
         {
-            OneFrameMessages oneFrameMessages = roomScene.GetComponent<ServerFrameRecvComponent>().Add(message);
+            OneFrameMessages oneFrameMessages = battleScene.GetComponent<ServerFrameRecvComponent>().Add(message);
             if (oneFrameMessages != null)
             if (oneFrameMessages != null)
             {
             {
-                BattleScene battleScene = roomScene.GetComponent<BattleScene>();
                 battleScene.FrameBuffer.AddRealFrame(oneFrameMessages);
                 battleScene.FrameBuffer.AddRealFrame(oneFrameMessages);
             }
             }
             
             
-            RoomMessageHelper.BroadCast(roomScene, oneFrameMessages);
+            RoomMessageHelper.BroadCast(battleScene, oneFrameMessages);
             await ETTask.CompletedTask;
             await ETTask.CompletedTask;
         }
         }
     }
     }

+ 3 - 3
Unity/Assets/Scripts/Codes/Hotfix/Server/LockStep/Map/Match2Map_GetRoomHandler.cs

@@ -8,9 +8,9 @@ namespace ET.Server
 	{
 	{
 		protected override async ETTask Run(Scene scene, Match2Map_GetRoom request, Map2Match_GetRoom response)
 		protected override async ETTask Run(Scene scene, Match2Map_GetRoom request, Map2Match_GetRoom response)
 		{
 		{
-			RoomManagerComponent roomManagerComponent = scene.GetComponent<RoomManagerComponent>();
-			Scene roomScene = await roomManagerComponent.CreateRoom(request);
-			response.InstanceId = roomScene.InstanceId;
+			BattleSceneManagerComponent battleSceneManagerComponent = scene.GetComponent<BattleSceneManagerComponent>();
+			BattleScene battleScene = await battleSceneManagerComponent.CreateBattleScene(request);
+			response.InstanceId = battleScene.InstanceId;
 			await ETTask.CompletedTask;
 			await ETTask.CompletedTask;
 		}
 		}
 	}
 	}

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

@@ -1,25 +0,0 @@
-using System;
-
-namespace ET.Server
-{
-
-    public static class RoomManagerComponentSystem
-    {
-        public static async ETTask<Scene> CreateRoom(this RoomManagerComponent self, Match2Map_GetRoom request)
-        {
-            long instanceId = IdGenerater.Instance.GenerateInstanceId();
-            Scene scene = await SceneFactory.CreateServerScene(
-                self, instanceId, instanceId, 
-                self.DomainZone(), "Room", SceneType.Room);
-            
-            scene.AddComponent<RoomServerComponent, Match2Map_GetRoom>(request);
-            
-            scene.AddComponent<ServerFrameRecvComponent>();
-            
-            BattleScene battleScene = scene.AddComponent<BattleScene>();
-            battleScene.LSWorld = new LSWorld(SceneType.LockStepClient);
-            
-            return scene;
-        }
-    }
-}

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

@@ -3,9 +3,9 @@ namespace ET.Server
 
 
     public static class RoomMessageHelper
     public static class RoomMessageHelper
     {
     {
-        public static void BroadCast(Scene roomScene, IActorMessage message)
+        public static void BroadCast(BattleScene battleScene, IActorMessage message)
         {
         {
-            RoomServerComponent roomServerComponent = roomScene.GetComponent<RoomServerComponent>();
+            RoomServerComponent roomServerComponent = battleScene.GetComponent<RoomServerComponent>();
             
             
             foreach (var kv in roomServerComponent.Children)
             foreach (var kv in roomServerComponent.Children)
             {
             {

+ 1 - 1
Unity/Assets/Scripts/Codes/Hotfix/Server/Module/Actor/ActorMessageDispatcherComponentSystem.cs

@@ -101,7 +101,7 @@ namespace ET.Server
                 throw new Exception($"not found message handler: {message} {entity.GetType().Name}");
                 throw new Exception($"not found message handler: {message} {entity.GetType().Name}");
             }
             }
 
 
-            SceneType sceneType = entity.DomainScene().SceneType;
+            SceneType sceneType = entity.DomainSceneType();
             foreach (ActorMessageDispatcherInfo actorMessageDispatcherInfo in list)
             foreach (ActorMessageDispatcherInfo actorMessageDispatcherInfo in list)
             {
             {
                 if (!actorMessageDispatcherInfo.SceneType.HasSameFlag(sceneType))
                 if (!actorMessageDispatcherInfo.SceneType.HasSameFlag(sceneType))

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

@@ -3,7 +3,7 @@ namespace ET
     [FriendOf(typeof(BattleScene))]
     [FriendOf(typeof(BattleScene))]
     public static class BattleSceneSystem
     public static class BattleSceneSystem
     {
     {
-        public static void Init(this BattleScene self, Room2C_BattleStart room2CBattleStart)
+        public static void Init(this BattleScene self, Battle2C_BattleStart room2CBattleStart)
         {
         {
             self.StartTime = room2CBattleStart.StartTime;
             self.StartTime = room2CBattleStart.StartTime;
 
 
@@ -17,6 +17,9 @@ namespace ET
 
 
         public static void Update(this BattleScene self, OneFrameMessages oneFrameMessages)
         public static void Update(this BattleScene self, OneFrameMessages oneFrameMessages)
         {
         {
+            // 保存当前帧场景数据
+            self.FrameBuffer.SaveDate(self.FrameBuffer.NowFrame, MongoHelper.Serialize(self.LSWorld));
+            
             // 设置输入到每个LSUnit身上
             // 设置输入到每个LSUnit身上
             LSWorld lsWorld = self.LSWorld;
             LSWorld lsWorld = self.LSWorld;
             LSUnitComponent unitComponent = lsWorld.GetComponent<LSUnitComponent>();
             LSUnitComponent unitComponent = lsWorld.GetComponent<LSUnitComponent>();
@@ -29,18 +32,15 @@ namespace ET
             }
             }
             
             
             lsWorld.Updater.Update();
             lsWorld.Updater.Update();
-            
-            // 保存当前帧场景数据
-            self.FrameBuffer.SaveDate(self.FrameBuffer.NowFrame, MongoHelper.Serialize(self.LSWorld));
         }
         }
 
 
         // 回滚
         // 回滚
         public static void Rollback(this BattleScene self, int frame)
         public static void Rollback(this BattleScene self, int frame)
         {
         {
-            byte[] dataBuffer = self.FrameBuffer.GetDate(frame);
+            Log.Debug($"Battle Scene roll back to {frame}");
             self.LSWorld.Dispose();
             self.LSWorld.Dispose();
-            LSWorld lsWorld = MongoHelper.Deserialize<LSWorld>(dataBuffer);
-            self.LSWorld = lsWorld;
+            byte[] dataBuffer = self.FrameBuffer.GetDate(frame);
+            self.LSWorld = MongoHelper.Deserialize<LSWorld>(dataBuffer);
         }
         }
     }
     }
 }
 }

+ 1 - 1
Unity/Assets/Scripts/Codes/Model/Client/LockStep/WaitType.cs

@@ -6,7 +6,7 @@ namespace ET
         {
         {
             public int Error { get; set; }
             public int Error { get; set; }
 
 
-            public Room2C_BattleStart Message;
+            public Battle2C_BattleStart Message;
         }
         }
     }
     }
 }
 }

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

@@ -43,9 +43,9 @@ namespace ET
 	}
 	}
 
 
 // 客户端通知房间切换场景完成
 // 客户端通知房间切换场景完成
-	[Message(LockStepOuter.C2Room_ChangeSceneFinish)]
+	[Message(LockStepOuter.C2Battle_ChangeSceneFinish)]
 	[ProtoContract]
 	[ProtoContract]
-	public partial class C2Room_ChangeSceneFinish: ProtoObject, IActorRoom
+	public partial class C2Battle_ChangeSceneFinish: ProtoObject, IActorRoom
 	{
 	{
 		[ProtoMember(1)]
 		[ProtoMember(1)]
 		public long PlayerId { get; set; }
 		public long PlayerId { get; set; }
@@ -68,9 +68,9 @@ namespace ET
 	}
 	}
 
 
 // 房间通知客户端进入战斗
 // 房间通知客户端进入战斗
-	[Message(LockStepOuter.Room2C_BattleStart)]
+	[Message(LockStepOuter.Battle2C_BattleStart)]
 	[ProtoContract]
 	[ProtoContract]
-	public partial class Room2C_BattleStart: ProtoObject, IActorMessage
+	public partial class Battle2C_BattleStart: ProtoObject, IActorMessage
 	{
 	{
 		[ProtoMember(1)]
 		[ProtoMember(1)]
 		public long StartTime { get; set; }
 		public long StartTime { get; set; }
@@ -124,9 +124,9 @@ namespace ET
 		 public const ushort C2G_Match = 11002;
 		 public const ushort C2G_Match = 11002;
 		 public const ushort G2C_Match = 11003;
 		 public const ushort G2C_Match = 11003;
 		 public const ushort Match2G_NotifyMatchSuccess = 11004;
 		 public const ushort Match2G_NotifyMatchSuccess = 11004;
-		 public const ushort C2Room_ChangeSceneFinish = 11005;
+		 public const ushort C2Battle_ChangeSceneFinish = 11005;
 		 public const ushort LockStepUnitInfo = 11006;
 		 public const ushort LockStepUnitInfo = 11006;
-		 public const ushort Room2C_BattleStart = 11007;
+		 public const ushort Battle2C_BattleStart = 11007;
 		 public const ushort LSInputInfo = 11008;
 		 public const ushort LSInputInfo = 11008;
 		 public const ushort FrameMessage = 11009;
 		 public const ushort FrameMessage = 11009;
 		 public const ushort OneFrameMessages = 11010;
 		 public const ushort OneFrameMessages = 11010;

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

@@ -43,9 +43,9 @@ namespace ET
 	}
 	}
 
 
 // 客户端通知房间切换场景完成
 // 客户端通知房间切换场景完成
-	[Message(LockStepOuter.C2Room_ChangeSceneFinish)]
+	[Message(LockStepOuter.C2Battle_ChangeSceneFinish)]
 	[ProtoContract]
 	[ProtoContract]
-	public partial class C2Room_ChangeSceneFinish: ProtoObject, IActorRoom
+	public partial class C2Battle_ChangeSceneFinish: ProtoObject, IActorRoom
 	{
 	{
 		[ProtoMember(1)]
 		[ProtoMember(1)]
 		public long PlayerId { get; set; }
 		public long PlayerId { get; set; }
@@ -68,9 +68,9 @@ namespace ET
 	}
 	}
 
 
 // 房间通知客户端进入战斗
 // 房间通知客户端进入战斗
-	[Message(LockStepOuter.Room2C_BattleStart)]
+	[Message(LockStepOuter.Battle2C_BattleStart)]
 	[ProtoContract]
 	[ProtoContract]
-	public partial class Room2C_BattleStart: ProtoObject, IActorMessage
+	public partial class Battle2C_BattleStart: ProtoObject, IActorMessage
 	{
 	{
 		[ProtoMember(1)]
 		[ProtoMember(1)]
 		public long StartTime { get; set; }
 		public long StartTime { get; set; }
@@ -124,9 +124,9 @@ namespace ET
 		 public const ushort C2G_Match = 11002;
 		 public const ushort C2G_Match = 11002;
 		 public const ushort G2C_Match = 11003;
 		 public const ushort G2C_Match = 11003;
 		 public const ushort Match2G_NotifyMatchSuccess = 11004;
 		 public const ushort Match2G_NotifyMatchSuccess = 11004;
-		 public const ushort C2Room_ChangeSceneFinish = 11005;
+		 public const ushort C2Battle_ChangeSceneFinish = 11005;
 		 public const ushort LockStepUnitInfo = 11006;
 		 public const ushort LockStepUnitInfo = 11006;
-		 public const ushort Room2C_BattleStart = 11007;
+		 public const ushort Battle2C_BattleStart = 11007;
 		 public const ushort LSInputInfo = 11008;
 		 public const ushort LSInputInfo = 11008;
 		 public const ushort FrameMessage = 11009;
 		 public const ushort FrameMessage = 11009;
 		 public const ushort OneFrameMessages = 11010;
 		 public const ushort OneFrameMessages = 11010;

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

@@ -43,9 +43,9 @@ namespace ET
 	}
 	}
 
 
 // 客户端通知房间切换场景完成
 // 客户端通知房间切换场景完成
-	[Message(LockStepOuter.C2Room_ChangeSceneFinish)]
+	[Message(LockStepOuter.C2Battle_ChangeSceneFinish)]
 	[ProtoContract]
 	[ProtoContract]
-	public partial class C2Room_ChangeSceneFinish: ProtoObject, IActorRoom
+	public partial class C2Battle_ChangeSceneFinish: ProtoObject, IActorRoom
 	{
 	{
 		[ProtoMember(1)]
 		[ProtoMember(1)]
 		public long PlayerId { get; set; }
 		public long PlayerId { get; set; }
@@ -68,9 +68,9 @@ namespace ET
 	}
 	}
 
 
 // 房间通知客户端进入战斗
 // 房间通知客户端进入战斗
-	[Message(LockStepOuter.Room2C_BattleStart)]
+	[Message(LockStepOuter.Battle2C_BattleStart)]
 	[ProtoContract]
 	[ProtoContract]
-	public partial class Room2C_BattleStart: ProtoObject, IActorMessage
+	public partial class Battle2C_BattleStart: ProtoObject, IActorMessage
 	{
 	{
 		[ProtoMember(1)]
 		[ProtoMember(1)]
 		public long StartTime { get; set; }
 		public long StartTime { get; set; }
@@ -124,9 +124,9 @@ namespace ET
 		 public const ushort C2G_Match = 11002;
 		 public const ushort C2G_Match = 11002;
 		 public const ushort G2C_Match = 11003;
 		 public const ushort G2C_Match = 11003;
 		 public const ushort Match2G_NotifyMatchSuccess = 11004;
 		 public const ushort Match2G_NotifyMatchSuccess = 11004;
-		 public const ushort C2Room_ChangeSceneFinish = 11005;
+		 public const ushort C2Battle_ChangeSceneFinish = 11005;
 		 public const ushort LockStepUnitInfo = 11006;
 		 public const ushort LockStepUnitInfo = 11006;
-		 public const ushort Room2C_BattleStart = 11007;
+		 public const ushort Battle2C_BattleStart = 11007;
 		 public const ushort LSInputInfo = 11008;
 		 public const ushort LSInputInfo = 11008;
 		 public const ushort FrameMessage = 11009;
 		 public const ushort FrameMessage = 11009;
 		 public const ushort OneFrameMessages = 11010;
 		 public const ushort OneFrameMessages = 11010;

+ 1 - 1
Unity/Assets/Scripts/Codes/Model/Server/LockStep/Map/RoomManagerComponent.cs → Unity/Assets/Scripts/Codes/Model/Server/LockStep/Map/BattleSceneManagerComponent.cs

@@ -1,7 +1,7 @@
 namespace ET.Server
 namespace ET.Server
 {
 {
     [ComponentOf(typeof(Scene))]
     [ComponentOf(typeof(Scene))]
-    public class RoomManagerComponent: Entity, IAwake
+    public class BattleSceneManagerComponent: Entity, IAwake
     {
     {
 
 
     }
     }

+ 0 - 0
Unity/Assets/Scripts/Codes/Model/Server/LockStep/Map/RoomManagerComponent.cs.meta → Unity/Assets/Scripts/Codes/Model/Server/LockStep/Map/BattleSceneManagerComponent.cs.meta


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

@@ -2,7 +2,7 @@ using System.Collections.Generic;
 
 
 namespace ET.Server
 namespace ET.Server
 {
 {
-    [ComponentOf(typeof(Scene))]
+    [ComponentOf(typeof(BattleScene))]
     public class RoomServerComponent: Entity, IAwake<Match2Map_GetRoom>
     public class RoomServerComponent: Entity, IAwake<Match2Map_GetRoom>
     {
     {
         public int AlreadyJoinRoomCount;
         public int AlreadyJoinRoomCount;

+ 1 - 1
Unity/Assets/Scripts/Codes/Model/Server/LockStep/Room/ServerFrameRecvComponent.cs

@@ -2,7 +2,7 @@ using System.Collections.Generic;
 
 
 namespace ET.Server
 namespace ET.Server
 {
 {
-    [ComponentOf(typeof(Scene))]
+    [ComponentOf(typeof(BattleScene))]
     public class ServerFrameRecvComponent: Entity, IAwake
     public class ServerFrameRecvComponent: Entity, IAwake
     {
     {
         public int NowFrame;
         public int NowFrame;

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

@@ -3,7 +3,8 @@ using TrueSync;
 
 
 namespace ET
 namespace ET
 {
 {
-    [ComponentOf(typeof(Scene))]
+    [ChildOf]
+    [ComponentOf]
     public class BattleScene: Entity, IScene, IAwake, IUpdate
     public class BattleScene: Entity, IScene, IAwake, IUpdate
     {
     {
         public SceneType SceneType { get; set; } = SceneType.Battle;
         public SceneType SceneType { get; set; } = SceneType.Battle;

+ 13 - 21
Unity/Assets/Scripts/Codes/Model/Share/LockStep/FrameBuffer.cs

@@ -8,8 +8,8 @@ namespace ET
         public int NowFrame { get; set; }
         public int NowFrame { get; set; }
 
 
         public int RealFrame { get; set; } = -1;
         public int RealFrame { get; set; } = -1;
-        
-        public int PredictionCount { get; set; }
+
+        public int PredictionCount { get; set; } = 3;
         
         
         private const int TotalFrameCount = 128;
         private const int TotalFrameCount = 128;
         
         
@@ -24,20 +24,6 @@ namespace ET
                 this.dataBuffer.Add(null);
                 this.dataBuffer.Add(null);
             }
             }
         }
         }
-        
-        private bool CheckFrame(int frame)
-        {
-            if (frame > this.RealFrame)
-            {
-                return false;
-            }
-            if (frame < this.RealFrame + 1 - TotalFrameCount || frame < 0)
-            {
-                return false;
-            }
-
-            return true;
-        }
 
 
         public void AddRealFrame(OneFrameMessages message)
         public void AddRealFrame(OneFrameMessages message)
         {
         {
@@ -46,12 +32,22 @@ namespace ET
                 throw new Exception($"add real frame error: {message.Frame} {this.RealFrame}");
                 throw new Exception($"add real frame error: {message.Frame} {this.RealFrame}");
             }
             }
             this.RealFrame = message.Frame;
             this.RealFrame = message.Frame;
+            AddFrame(message);
+        }
+
+        public void AddFrame(OneFrameMessages message)
+        {
             this.messageBuffer[message.Frame % TotalFrameCount] = message;
             this.messageBuffer[message.Frame % TotalFrameCount] = message;
         }
         }
         
         
         public OneFrameMessages GetFrame(int frame)
         public OneFrameMessages GetFrame(int frame)
         {
         {
-            if (!CheckFrame(frame))
+            if (frame < 0)
+            {
+                return null;
+            }
+
+            if (frame > this.RealFrame + this.PredictionCount)
             {
             {
                 return null;
                 return null;
             }
             }
@@ -65,10 +61,6 @@ namespace ET
 
 
         public byte[] GetDate(int frame)
         public byte[] GetDate(int frame)
         {
         {
-            if (!CheckFrame(frame))
-            {
-                return null;
-            }
             return this.dataBuffer[frame % TotalFrameCount];
             return this.dataBuffer[frame % TotalFrameCount];
         }
         }
     }
     }

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

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

+ 15 - 4
Unity/Assets/Scripts/Codes/Model/Share/LockStep/OneFrameMessage.cs

@@ -56,13 +56,24 @@ namespace ET
                 return false;
                 return false;
             }
             }
 
 
-            for (int i = 0; i < LSConstValue.MatchCount; ++i)
+            if (a.InputInfos.Count != b.InputInfos.Count)
             {
             {
-                if (a.InputInfos[i] != b.InputInfos[i])
+                return false;
+            }
+
+            foreach (var kv in a.InputInfos)
+            {
+                if (!b.InputInfos.TryGetValue(kv.Key, out LSInputInfo inputInfo))
+                {
+                    return false;
+                }
+
+                if (kv.Value != inputInfo)
                 {
                 {
                     return false;
                     return false;
                 }
                 }
             }
             }
+
             return true;
             return true;
         }
         }
 
 
@@ -72,9 +83,9 @@ namespace ET
         }
         }
     }
     }
     
     
-    public partial class Room2C_BattleStart
+    public partial class Battle2C_BattleStart
     {
     {
-        public Room2C_BattleStart()
+        public Battle2C_BattleStart()
         {
         {
             this.UnitInfo = new List<LockStepUnitInfo>(LSConstValue.MatchCount);
             this.UnitInfo = new List<LockStepUnitInfo>(LSConstValue.MatchCount);
         }
         }

+ 5 - 0
Unity/Assets/Scripts/Core/Module/Entity/SceneHelper.cs

@@ -11,5 +11,10 @@ namespace ET
         {
         {
             return entity.Domain as Scene;
             return entity.Domain as Scene;
         }
         }
+        
+        public static SceneType DomainSceneType(this Entity entity)
+        {
+            return entity.Domain.SceneType;
+        }
     }
     }
 }
 }

+ 1 - 2
Unity/Assets/Scripts/Core/Module/Entity/SceneType.cs

@@ -20,10 +20,9 @@ namespace ET
 		BenchmarkServer = 1 << 12,
 		BenchmarkServer = 1 << 12,
 		Benchmark = 1 << 13,
 		Benchmark = 1 << 13,
 		Match = 1 << 14,
 		Match = 1 << 14,
-		Room = 1 << 15,
+		Battle = 1 << 15,
 		LockStepClient = 1 << 16,
 		LockStepClient = 1 << 16,
 		LockStepServer = 1 << 17,
 		LockStepServer = 1 << 17,
-		Battle = 1 << 18,
 
 
 		// 客户端Model层
 		// 客户端Model层
 		Client = 1 << 30,
 		Client = 1 << 30,

+ 1 - 1
Unity/ProjectSettings/ProjectSettings.asset

@@ -841,7 +841,7 @@ PlayerSettings:
   scriptingDefineSymbols:
   scriptingDefineSymbols:
     Android: UNITY;SINGLE_THREAD
     Android: UNITY;SINGLE_THREAD
     Server: UNITY
     Server: UNITY
-    Standalone: UNITY;SINGLE_THREAD;ENABLE_CODES
+    Standalone: UNITY;SINGLE_THREAD;ENABLE_CODES;ENABLE_VIEW
     WebGL: UNITY
     WebGL: UNITY
     iPhone: UNITY;SINGLE_THREAD;ENABLE_CODES
     iPhone: UNITY;SINGLE_THREAD;ENABLE_CODES
   additionalCompilerArguments: {}
   additionalCompilerArguments: {}