LSClientUpdaterSystem.cs 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. using System;
  2. using System.IO;
  3. namespace ET.Client
  4. {
  5. [EntitySystemOf(typeof(LSClientUpdater))]
  6. public static partial class LSClientUpdaterSystem
  7. {
  8. [EntitySystem]
  9. private static void Awake(this LSClientUpdater self)
  10. {
  11. Room room = self.GetParent<Room>();
  12. self.MyId = room.Root().GetComponent<PlayerComponent>().MyId;
  13. }
  14. [EntitySystem]
  15. private static void Update(this LSClientUpdater self)
  16. {
  17. Room room = self.GetParent<Room>();
  18. long timeNow = TimeInfo.Instance.ServerNow();
  19. Scene root = room.Root();
  20. int i = 0;
  21. while (true)
  22. {
  23. if (timeNow < room.FixedTimeCounter.FrameTime(room.PredictionFrame + 1))
  24. {
  25. return;
  26. }
  27. // 最多只预测5帧
  28. if (room.PredictionFrame - room.AuthorityFrame > 5)
  29. {
  30. return;
  31. }
  32. ++room.PredictionFrame;
  33. OneFrameInputs oneFrameInputs = self.GetOneFrameMessages(room.PredictionFrame);
  34. Log.Debug($"predictionFrame: {MongoHelper.ToJson(oneFrameInputs)}");
  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<ClientSenderComponent>().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. predictionFrame.Frame = frame;
  67. return predictionFrame;
  68. }
  69. }
  70. }