LSHelper.cs 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  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($"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($"roll back finish {frame}");
  26. }
  27. private static void CopyOtherInputsTo(Room room, OneFrameMessages from, OneFrameMessages to)
  28. {
  29. long myId = room.GetComponent<RoomClientUpdater>().MyId;
  30. foreach (var kv in from.Inputs)
  31. {
  32. if (kv.Key == myId)
  33. {
  34. continue;
  35. }
  36. to.Inputs[kv.Key] = kv.Value;
  37. }
  38. }
  39. }
  40. }