网络游戏帧同步

本文深入探讨了帧同步技术,即操作同步,确保不同客户端在相同时间的输入和逻辑运算得到一致结果。通过使用UDP协议解决TCP的速度问题,并通过包含前几个未同步帧的操作来克服UDP的丢包和乱序问题。文章还介绍了protobuf代码实现和客户端帧发送策略,以及如何通过缓冲和定时同步提升用户体验。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

什么是帧同步?帧同步就是"操作同步",核心思想就是不同客户端在相同时间的输入然后一样的逻辑运算就会得到相同的结果.

网络协议应该选用 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;//
               
            }}
        }

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值