帧同步是否允许客户端指定命令帧号

帧同步是否允许客户端指定命令帧号

(金庆的专栏 2020.10)

帧同步服务器以固定的帧率收集每个客户端的输入命令,每帧打包一个命令帧,打上服务器当前帧号,
然后广播该命令帧到每个客户端,由客户端执行。
如果没有客户端输入命令,则该命令帧可能只有一个帧号。

客户端的输入命令分2种模式:不指定帧号和指定帧号。

客户端不指定帧号的模式下,客户端仅告诉服务器自己的动作,由服务器为该动作打上当前的服务器帧号,然后再广播。
服务器实现较简单,只需要缓存当前帧的所有客户端输入,下一帧时全部打包广播。

指定帧号的模式下,客户端要求该命令在指定帧(服务器帧)才生效。
服务器需要缓存该命令,运行到指定帧号时,才将该命令打包到命令帧并广播所有客户端。

指定帧号在客户端有预测回滚时较为有利,因为客户端知道自己的命令将在确定的帧执行,即对自己的预测总是成功的。
而如果不指定帧号,客户端需要预测自己的命令会在哪个服务器帧到达服务器,而这在网络抖动较大时会预测失败。

指定帧号会造成命令的延时时间较长。而不指定帧号将会立即执行。

如果网络堵塞了一会儿,客户端发送的命令延时了较长时间才到达服务器,
指定的帧号可能小于服务器当前帧号,这时服务器对该命令有2种处理方式.
一种是直接忽略该命令,因为该命令已无法实现。
一种是尽量实现该命令,即在当前帧执行。
考虑到客户端预测,2种都是预测失败,同样需要回滚,但是在当前帧执行可能回滚造成的抖动会小一点。
如起跳命令,一种是已经跳起来了被拉回地面,因为起跳命令被取消了,一种是跳在空中停顿了一下,因为起跳的时间点被延后了。
尽量实现命令应该比丢弃命令更好一点。

如果是在当前服务器帧执行过期帧号的命令,那么这2种模式可以合并成一种,即所有命令都是指定帧号,
只是有的帧号是0,表示让服务器在当前帧执行。

通用的帧同步服务器应该让客户端指定帧号。

指定帧号的命令可以实现严格时间间隔的命令序列,
客户端可以一次性发送整个命令序列,指定每个命令为不同的帧号。
还应该允许客户端指定命令序列的帧间隔,但是首命令是立即执行的。
命令序列的帧号应该是相对于首命令的。
如果命令序列的首命令延后执行,那么整个序列全部将同样延后。

客户端是否需要知道自己的指定帧号命令被延后执行了?这样可以让客户端有更好的表现?
那么成功执行的指定帧号命令是否也应该让客户端知道?
服务器仅仅是将客户端命令原样广播,客户端命令中可以加入命令序号,自行判断命令是否延后了。

是否将一个玩家的提前发送的指定帧命令提前广播给其他玩家?
这样其他玩家不仅对自己预测成功,对该玩家的预测也成功。
但是泄露了自己将要执行的动作会被其他玩家利用。
所以提前量不能太大,指定帧号应该尽量接近服务器帧号。
服务器就不用缓存客户端指令了,直接收到后广播即可。
这样服务器广播的命令帧中有服务器帧号,也有客户端的指定帧号。
服务器也就不用管客户端是否指定帧号了。
指定帧号和解析成为纯客户端逻辑。

帧同步是一种多人在线游戏中常用的同步方式,其主要目的是确保多个客户端之间的游戏状态保持一致。在帧同步中,客户端需要将自己的游戏状态打包成一个数据,并发送给服务器,服务器再将所有客户端数据组合成一个完整的游戏,然后广播给所有客户端客户端的实现主要有以下几个步骤: 1. 收集游戏状态:客户端需要收集当前游戏状态,包括玩家位置、状态、动作等信息。 2. 打包数据:将收集到的游戏状态打包成一个数据,包括、时间戳、玩家状态等信息,并将其发送给服务器。 3. 等待服务器响应:客户端需要等待服务器响应,确认自己的数据已经被接收。 4. 接收服务器广播:客户端需要接收服务器广播的游戏数据,并解析其中包含的所有玩家状态信息。 5. 更新游戏状态:客户端根据接收到的游戏数据更新自己的游戏状态,确保与服务器和其他客户端的状态保持一致。 6. 重复执行1-5步骤:客户端需要不断地重复执行1-5步骤,以确保游戏状态的同步。 需要注意的是,在帧同步中,客户端需要保证数据的实时性和准确性,否则可能会导致游戏状态不同步,影响游戏体验。因此,客户端的实现需要考虑到网络延迟、率控制等因素,以确保游戏数据的及时传输和正确解析。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值