using System; using System.IO; namespace ET.Client { [EntitySystemOf(typeof(LSClientUpdater))] [FriendOf(typeof (LSClientUpdater))] public static partial class LSClientUpdaterSystem { [EntitySystem] private static void Awake(this LSClientUpdater self) { Room room = self.GetParent(); self.MyId = room.Root().GetComponent().MyId; } [EntitySystem] private static void Update(this LSClientUpdater self) { Room room = self.GetParent(); long timeNow = self.Fiber().TimeInfo.ServerNow(); Scene root = room.Root(); int i = 0; while (true) { 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.SendHash(room.PredictionFrame); room.SpeedMultiply = ++i; FrameMessage frameMessage = FrameMessage.Create(); frameMessage.Frame = room.PredictionFrame; frameMessage.Input = self.Input; root.GetComponent().Send(frameMessage); long timeNow2 = self.Fiber().TimeInfo.ServerNow(); if (timeNow2 - timeNow > 5) { break; } } } private static OneFrameInputs GetOneFrameMessages(this LSClientUpdater 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); frameBuffer.MoveForward(frame); if (frameBuffer.CheckFrame(room.AuthorityFrame)) { OneFrameInputs authorityFrame = frameBuffer.FrameInputs(room.AuthorityFrame); authorityFrame.CopyTo(predictionFrame); } predictionFrame.Inputs[self.MyId] = self.Input; return predictionFrame; } } }