LSClientUpdaterSystem.cs 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. using System;
  2. using System.IO;
  3. namespace ET.Client
  4. {
  5. [EntitySystemOf(typeof(LSClientUpdater))]
  6. [FriendOf(typeof (LSClientUpdater))]
  7. public static partial class LSClientUpdaterSystem
  8. {
  9. [EntitySystem]
  10. private static void Awake(this LSClientUpdater self)
  11. {
  12. Room room = self.GetParent<Room>();
  13. self.MyId = room.Root().GetComponent<PlayerComponent>().MyId;
  14. }
  15. [EntitySystem]
  16. private static void Update(this LSClientUpdater self)
  17. {
  18. Room room = self.GetParent<Room>();
  19. long timeNow = TimeInfo.Instance.ServerNow();
  20. Scene root = room.Root();
  21. int i = 0;
  22. while (true)
  23. {
  24. if (timeNow < room.FixedTimeCounter.FrameTime(room.PredictionFrame + 1))
  25. {
  26. return;
  27. }
  28. // 最多只预测5帧
  29. if (room.PredictionFrame - room.AuthorityFrame > 5)
  30. {
  31. return;
  32. }
  33. ++room.PredictionFrame;
  34. OneFrameInputs oneFrameInputs = self.GetOneFrameMessages(room.PredictionFrame);
  35. Log.Debug($"predictionFrame: {MongoHelper.ToJson(oneFrameInputs)}");
  36. room.Update(oneFrameInputs);
  37. room.SendHash(room.PredictionFrame);
  38. room.SpeedMultiply = ++i;
  39. FrameMessage frameMessage = FrameMessage.Create();
  40. frameMessage.Frame = room.PredictionFrame;
  41. frameMessage.Input = self.Input;
  42. root.GetComponent<ClientSenderComponent>().Send(frameMessage);
  43. long timeNow2 = TimeInfo.Instance.ServerNow();
  44. if (timeNow2 - timeNow > 5)
  45. {
  46. break;
  47. }
  48. }
  49. }
  50. private static OneFrameInputs GetOneFrameMessages(this LSClientUpdater self, int frame)
  51. {
  52. Room room = self.GetParent<Room>();
  53. FrameBuffer frameBuffer = room.FrameBuffer;
  54. if (frame <= room.AuthorityFrame)
  55. {
  56. return frameBuffer.FrameInputs(frame);
  57. }
  58. // predict
  59. OneFrameInputs predictionFrame = frameBuffer.FrameInputs(frame);
  60. frameBuffer.MoveForward(frame);
  61. if (frameBuffer.CheckFrame(room.AuthorityFrame))
  62. {
  63. OneFrameInputs authorityFrame = frameBuffer.FrameInputs(room.AuthorityFrame);
  64. authorityFrame.CopyTo(predictionFrame);
  65. }
  66. predictionFrame.Inputs[self.MyId] = self.Input;
  67. predictionFrame.Frame = frame;
  68. return predictionFrame;
  69. }
  70. }
  71. }