什么是帧同步?帧同步就是"操作同步",核心思想就是不同客户端在相同时间的输入然后一样的逻辑运算就会得到相同的结果.
网络协议应该选用 udp,因为udp比起tcp传输更快,但是udp有一个问题就是传输的包可能丢掉或者乱序,所以一个同步帧应该包含前面几个未同步的帧的操作这样就解决了乱序和丢包的问题
以下就是protobuf的代码
enum OpType{//操作类型
skill=0;
move=1;
attack=2;
}
message Operation{//玩家的操作
required int32 playerid=1;
required OpType opt_type=2;
optional int32 x=3;
optional int32 y=4;
}
message FrameOpt{//玩家一个帧要同步的所有操作
required int32 frameid=1;//第几帧的操作
repeated Operation operations=2;//玩家的操作列表
}
message LogicFrame{//发给用户的所有未同步的帧对象
required int32 frameid=1;//帧的id
repeated FrameOpt unsync_frames=2;//所有未同步的帧
}
一个客户端操作帧发送的间隔在50-100毫秒,但是发送给服务器和服务器转发给客户端都有一点延迟,所以这就导致了有时候客户端一会快一会慢,用户操作十分不流畅,所以我的解决思路是先将服务器同步到客户端的帧保存到一个缓冲列表里,然后每20毫秒取出列表的同步帧同步,这样就可以使执行帧率相对稳定
float SMOOTHSPAN=0.02f;
void FrameUpdate(){
processSpan -= Time.deltaTime;
if (frames.Count > 0)
{
if (processSpan <= 0)
{
LogicFrame frame2 = frames.Dequeue();
ProcessFrame(frame2);//同步帧
processSpan = SMOOTHSPAN;//
}}
}