设计原则:
- 玩家在按下的时候,就会看到子弹射出去。
- 这种设计注定了,玩家会收到其他玩家在之前时间射出的子弹
- 优先保证自己的准确性,其他玩家的准确性可惜部分牺牲
同步方案:
- 服务器按照固定频率下发同步帧,假定每秒10帧。每帧数据包括帧号、4个玩家的炮台发射角度,没有发射则发-90度表示空。
- 通常客户端的逻辑帧为同步帧的2倍,即每秒20帧。比如服务器下发的帧号为1、3、5、7、9。客户端会在中间补帧成1、2、3、4、5。
- 客户端逻辑帧间隔大,直接更新鱼的位置会出现跳跃,需要用比如60帧的渲染帧来平滑展现。
- 客户端按下屏幕射出子弹,告诉子弹的角度以及逻辑帧的帧号,服务器收到后,广播给所有玩家。
- 比如A在4帧按下的子弹信息,B、C、D收到的时候已经是服务器下发的第10帧了。这时候1可以直接无视,让子弹在10帧射出去,这样看别人的就会不同步,但是3个人看到的信息是同步的。2是把当前的鱼往回倒退到第4帧,开始让子弹出来,并开始计算碰撞。如果在4帧到10帧的时候已经撞了,那么直接在鱼身上播碰撞特效。如果没撞,那么此时子弹是和A是同步的,因为都是从第4帧开始出发。
- 第二种方案,需要记录所有鱼在比如最近10帧的位置信息,占用内存,每帧收到其他3人的子弹,都会额外计算1-10帧的碰撞,占用CPU。不过这种方案同步效果是最好
- 因为鱼是固定的,所有客户端在收到服务器下发的鱼信息后,就自己按照帧号来更新鱼的位置。
- 如果没收到服务器下发的同步帧,鱼也应该继续走,当收到后,补上前几帧的子弹。