LSClientUpdaterSystem.cs 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. using System;
  2. using System.IO;
  3. namespace ET.Client
  4. {
  5. [FriendOf(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.GetParent<Scene>().GetComponent<PlayerComponent>().MyId;
  13. }
  14. [EntitySystem]
  15. private static void Update(this LSClientUpdater self)
  16. {
  17. Room room = self.GetParent<Room>();
  18. long timeNow = TimeHelper.ServerNow();
  19. Scene clientScene = room.GetParent<Scene>();
  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. room.Update(oneFrameInputs);
  35. room.SendHash(room.PredictionFrame);
  36. room.SpeedMultiply = ++i;
  37. FrameMessage frameMessage = NetServices.Instance.FetchMessage<FrameMessage>();
  38. frameMessage.Frame = room.PredictionFrame;
  39. frameMessage.Input = self.Input;
  40. clientScene.GetComponent<SessionComponent>().Session.Send(frameMessage);
  41. long timeNow2 = TimeHelper.ServerNow();
  42. if (timeNow2 - timeNow > 5)
  43. {
  44. break;
  45. }
  46. }
  47. }
  48. private static OneFrameInputs GetOneFrameMessages(this LSClientUpdater self, int frame)
  49. {
  50. Room room = self.GetParent<Room>();
  51. FrameBuffer frameBuffer = room.FrameBuffer;
  52. if (frame <= room.AuthorityFrame)
  53. {
  54. return frameBuffer.FrameInputs(frame);
  55. }
  56. // predict
  57. OneFrameInputs predictionFrame = frameBuffer.FrameInputs(frame);
  58. frameBuffer.MoveForward(frame);
  59. if (frameBuffer.CheckFrame(room.AuthorityFrame))
  60. {
  61. OneFrameInputs authorityFrame = frameBuffer.FrameInputs(room.AuthorityFrame);
  62. authorityFrame.CopyTo(predictionFrame);
  63. }
  64. predictionFrame.Inputs[self.MyId] = self.Input;
  65. return predictionFrame;
  66. }
  67. }
  68. }