mirror of
https://github.com/Alex-Rachel/TEngine.git
synced 2025-08-14 16:51:28 +00:00
83 lines
2.7 KiB
C#
83 lines
2.7 KiB
C#
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<Room>();
|
|
self.MyId = room.Root().GetComponent<PlayerComponent>().MyId;
|
|
}
|
|
|
|
[EntitySystem]
|
|
private static void Update(this LSClientUpdater self)
|
|
{
|
|
Room room = self.GetParent<Room>();
|
|
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<ClientSenderCompnent>().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<Room>();
|
|
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;
|
|
}
|
|
}
|
|
} |