using System; using System.IO; namespace ET.Client { [FriendOf(typeof (RoomClientUpdater))] public static class RoomClientUpdaterSystem { public class AwakeSystem: AwakeSystem { protected override void Awake(RoomClientUpdater self) { Room room = self.GetParent(); self.MyId = room.GetParent().GetComponent().MyId; } } public class UpdateSystem: UpdateSystem { protected override void Update(RoomClientUpdater self) { self.Update(); } } private static void Update(this RoomClientUpdater self) { Room room = self.GetParent(); long timeNow = TimeHelper.ServerFrameTime(); Scene clientScene = room.GetParent(); if (timeNow < room.FixedTimeCounter.FrameTime(room.PredictionFrame + 1)) { return; } // 最多只预测5帧 if (room.PredictionFrame - room.AuthorityFrame > 5) { return; } ++room.PredictionFrame; OneFrameInputs oneFrameInputs = self.GetOneFrameMessages(room.PredictionFrame); room.Update(oneFrameInputs, room.PredictionFrame); FrameMessage frameMessage = NetServices.Instance.FetchMessage(); frameMessage.Frame = room.PredictionFrame; frameMessage.Input = self.Input; clientScene.GetComponent().Session.Send(frameMessage); } private static OneFrameInputs GetOneFrameMessages(this RoomClientUpdater self, int frame) { Room room = self.GetParent(); FrameBuffer frameBuffer = room.FrameBuffer; if (frame <= room.AuthorityFrame) { return frameBuffer.FrameInputs(frame); } // predict OneFrameInputs predictionFrame = frameBuffer.FrameInputs(frame); if (predictionFrame == null) { throw new Exception($"get frame is null: {frame}, max frame: {frameBuffer.MaxFrame}"); } frameBuffer.MoveForward(frame); OneFrameInputs authorityFrame = frameBuffer.FrameInputs(room.AuthorityFrame); authorityFrame?.CopyTo(predictionFrame); predictionFrame.Inputs[self.MyId] = self.Input; return predictionFrame; } } }