LSHelper.cs 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. using ET.Client;
  2. namespace ET
  3. {
  4. public static class LSHelper
  5. {
  6. // 回滚
  7. public static void Rollback(Room room, int frame)
  8. {
  9. Log.Debug($"Room Scene roll back start {frame}");
  10. room.LSWorld.Dispose();
  11. FrameBuffer frameBuffer = room.FrameBuffer;
  12. // 回滚
  13. room.LSWorld = frameBuffer.GetLSWorld(frame);
  14. OneFrameMessages realFrameMessage = frameBuffer.GetFrame(frame);
  15. // 执行RealFrame
  16. room.Update(realFrameMessage, frame);
  17. // 重新执行预测的帧
  18. for (int i = frameBuffer.RealFrame + 1; i < frameBuffer.PredictionFrame; ++i)
  19. {
  20. OneFrameMessages oneFrameMessages = frameBuffer.GetFrame(i);
  21. CopyOtherInputsTo(room, realFrameMessage, oneFrameMessages); // 重新预测剩下预测过的消息
  22. room.Update(oneFrameMessages, i);
  23. }
  24. RollbackHelper.Rollback(room);
  25. Log.Debug($"Room Scene roll back finish {frame}");
  26. }
  27. public static void CopyOtherInputsTo(Room room, OneFrameMessages from, OneFrameMessages to)
  28. {
  29. long myId = room.GetComponent<RoomClientUpdater>().MyId;
  30. to.Inputs.Clear();
  31. foreach (var kv in from.Inputs)
  32. {
  33. if (kv.Key == myId)
  34. {
  35. continue;
  36. }
  37. to.Inputs.Add(kv.Key, kv.Value);
  38. }
  39. Log.Debug($"copy inputs to: {to.ToJson()}");
  40. }
  41. }
  42. }