LSClientUpdaterSystem.cs 2.7 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. room.Update(oneFrameInputs);
  36. room.SendHash(room.PredictionFrame);
  37. room.SpeedMultiply = ++i;
  38. FrameMessage frameMessage = FrameMessage.Create();
  39. frameMessage.Frame = room.PredictionFrame;
  40. frameMessage.Input = self.Input;
  41. root.GetComponent<ClientSenderCompnent>().Send(frameMessage);
  42. long timeNow2 = TimeInfo.Instance.ServerNow();
  43. if (timeNow2 - timeNow > 5)
  44. {
  45. break;
  46. }
  47. }
  48. }
  49. private static OneFrameInputs GetOneFrameMessages(this LSClientUpdater self, int frame)
  50. {
  51. Room room = self.GetParent<Room>();
  52. FrameBuffer frameBuffer = room.FrameBuffer;
  53. if (frame <= room.AuthorityFrame)
  54. {
  55. return frameBuffer.FrameInputs(frame);
  56. }
  57. // predict
  58. OneFrameInputs predictionFrame = frameBuffer.FrameInputs(frame);
  59. frameBuffer.MoveForward(frame);
  60. if (frameBuffer.CheckFrame(room.AuthorityFrame))
  61. {
  62. OneFrameInputs authorityFrame = frameBuffer.FrameInputs(room.AuthorityFrame);
  63. authorityFrame.CopyTo(predictionFrame);
  64. }
  65. predictionFrame.Inputs[self.MyId] = self.Input;
  66. return predictionFrame;
  67. }
  68. }
  69. }