RoomClientUpdaterSystem.cs 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. using System;
  2. using System.IO;
  3. namespace ET.Client
  4. {
  5. [FriendOf(typeof (RoomClientUpdater))]
  6. public static class RoomClientUpdaterSystem
  7. {
  8. public class AwakeSystem: AwakeSystem<RoomClientUpdater>
  9. {
  10. protected override void Awake(RoomClientUpdater self)
  11. {
  12. Room room = self.GetParent<Room>();
  13. self.MyId = room.GetParent<Scene>().GetComponent<PlayerComponent>().MyId;
  14. }
  15. }
  16. public class UpdateSystem: UpdateSystem<RoomClientUpdater>
  17. {
  18. protected override void Update(RoomClientUpdater self)
  19. {
  20. self.Update();
  21. }
  22. }
  23. private static void Update(this RoomClientUpdater self)
  24. {
  25. Room room = self.GetParent<Room>();
  26. long timeNow = TimeHelper.ServerFrameTime();
  27. Scene clientScene = room.GetParent<Scene>();
  28. if (timeNow < room.FixedTimeCounter.FrameTime(room.PredictionFrame + 1))
  29. {
  30. return;
  31. }
  32. // 最多只预测5帧
  33. if (room.PredictionFrame - room.RealFrame > 5)
  34. {
  35. return;
  36. }
  37. ++room.PredictionFrame;
  38. OneFrameInputs oneFrameInputs = self.GetOneFrameMessages(room.PredictionFrame);
  39. room.Update(oneFrameInputs, room.PredictionFrame);
  40. FrameMessage frameMessage = NetServices.Instance.FetchMessage<FrameMessage>();
  41. frameMessage.Frame = room.PredictionFrame;
  42. frameMessage.Input = self.Input;
  43. clientScene.GetComponent<SessionComponent>().Session.Send(frameMessage);
  44. }
  45. private static OneFrameInputs GetOneFrameMessages(this RoomClientUpdater self, int frame)
  46. {
  47. Room room = self.GetParent<Room>();
  48. FrameBuffer frameBuffer = room.FrameBuffer;
  49. if (frame <= room.RealFrame)
  50. {
  51. return frameBuffer[frame];
  52. }
  53. // predict
  54. OneFrameInputs predictionFrame = frameBuffer[frame];
  55. if (predictionFrame == null)
  56. {
  57. throw new Exception($"get frame is null: {frame}, max frame: {frameBuffer.MaxFrame}");
  58. }
  59. frameBuffer.MoveForward(frame);
  60. OneFrameInputs realFrame = frameBuffer[room.RealFrame];
  61. realFrame?.CopyTo(predictionFrame);
  62. predictionFrame.Inputs[self.MyId] = self.Input;
  63. return predictionFrame;
  64. }
  65. }
  66. }