ClientFrameComponent学习笔记
请大家关注我的微博:@NormanLin_BadPixel坏像素
这个,就是帧同步的核心了吧!我们可以把它理解为帧信息的中心管理器,这里会处理所有的帧信息,并把帧内的具体消息转发出去。
public int Frame;
这个,应该就是记录当前已经更新到第几帧。
public Queue<SessionFrameMessage> Queue = new Queue<SessionFrameMessage>();
这个,就是保存待更新的帧信息吧!
public struct SessionFrameMessage
{
public Session Session;
public FrameMessage FrameMessage;
}
我们看一个完整的帧信息,包含一个网络对话Session,包含一个FrameMessage。
FrameMessage
[Message(Opcode.FrameMessage)]
[ProtoContract]
public partial class FrameMessage : MessageObject, IActorMessage
{
[ProtoMember(1, IsRequired = true)]
public int Frame;
[ProtoMember(2)]
public List<MessageObject> Messages = new List<MessageObject>();
}
大家就着源码看吧。MessageObject就是一个基类,具体要看其派生类。
ClientFrameComponent
public void Add(Session session, FrameMessage frameMessage)
{
this.Queue.Enqueue(new SessionFrameMessage() {Session = session, FrameMessage = frameMessage});
}
这个方法是往帧队列里面添加帧信息的。
我们重点看一下对帧的更新
public async void UpdateAsync()
{
TimerComponent timerComponent = Game.Scene.GetComponent<TimerComponent>();
while (true)
{
// 如果队列中消息多于4个,则加速跑帧
this.waitTime = maxWaitTime;
if (this.Queue.Count > 4)
{
this.waitTime = maxWaitTime - (this.Queue.Count - 4) * 2;
}
// 最快加速一倍
if (this.waitTime < 20)
{
this.waitTime = 20;
}
await timerComponent.WaitAsync(waitTime);
if (this.IsDisposed)
{
return;
}
this.UpdateFrame();
}
}
我们看到,这是一个异步的方法,也是一个简单的间隔运行的写法,就是隔一段时间执行一次。那么是隔多长呢?一般情况是隔maxWaitTime,40毫秒。如果帧队列里面的消息多于4个,则加速跑帧。
private void UpdateFrame()
{
if (this.Queue.Count == 0)
{
return;
}
SessionFrameMessage sessionFrameMessage = this.Queue.Dequeue();
this.Frame = sessionFrameMessage.FrameMessage.Frame;
for (int i = 0; i < sessionFrameMessage.FrameMessage.Messages.Count; ++i)
{
IFrameMessage message = (IFrameMessage)sessionFrameMessage.FrameMessage.Messages[i];
ushort opcode = Game.Scene.GetComponent<OpcodeTypeComponent>().GetOpcode(message.GetType());
Game.Scene.GetComponent<MessageDispatherComponent>().Handle(sessionFrameMessage.Session, new MessageInfo(0, opcode, message));
}
}
在每次更新帧的时候,会从帧队列中出列一个帧信息,然后会遍历这个帧信息当中包含的所有内容,再通过MessageDispatherComponent分发出去。MessageDispatherComponent我们之前学过的哦。