OneFrameMessagesHandler.cs 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. using System;
  2. namespace ET.Client
  3. {
  4. [MessageHandler(SceneType.Client)]
  5. public class OneFrameMessagesHandler: AMHandler<OneFrameMessages>
  6. {
  7. protected override async ETTask Run(Session session, OneFrameMessages message)
  8. {
  9. Room room = session.DomainScene().GetComponent<Room>();
  10. FrameBuffer frameBuffer = room.FrameBuffer;
  11. if (message.Frame != room.RealFrame + 1)
  12. {
  13. throw new Exception($"recv oneframeMessage frame error: {message.Frame} {room.RealFrame}");
  14. }
  15. ++room.RealFrame;
  16. // 服务端返回的消息比预测的还早
  17. if (room.RealFrame > room.PredictionFrame)
  18. {
  19. OneFrameMessages realFrame = frameBuffer[room.RealFrame];
  20. message.CopyTo(realFrame);
  21. return;
  22. }
  23. // 服务端返回来的消息,跟预测消息对比
  24. OneFrameMessages predictionMessage = frameBuffer[message.Frame];
  25. // 对比失败有两种可能,
  26. // 1是别人的输入预测失败,这种很正常,
  27. // 2 自己的输入对比失败,这种情况是自己发送的消息比服务器晚到了,服务器使用了你的上一次输入
  28. // 回滚重新预测的时候,自己的输入不用变化
  29. if (message != predictionMessage)
  30. {
  31. message.CopyTo(predictionMessage);
  32. // 回滚到frameBuffer.RealFrame
  33. LSHelper.Rollback(room, room.RealFrame);
  34. }
  35. // 回收消息,减少GC
  36. NetServices.Instance.RecycleMessage(message);
  37. await ETTask.CompletedTask;
  38. }
  39. }
  40. }