【源码分享】帧同步框架DEMO之 nodejs版

我们一开始是使用信任多数,但后面好像是出了什么问题才改成这样的,不过现在想想这样也有问题

最可靠的是引入服务器做仲裁者,服务器跟着客户端一起跑帧逻辑,那么每一帧的hash都以服务器为准。不过服务器的负载就大了,叫老板多买几个机器做服务器。

信任多数已经能解决很多作弊问题了。场景有10个玩家,8个作弊,结果都不同,唯有其中两个人的结果相同,那就以这两个人的数据为准。这样的准确率有90%,想两个人作弊能做出相同的结果概率很低

暂时不考虑作弊的问题,这个有专门的方案应对,暂且完全相信客户端发的请求

如果服务器没有跑一遍逻辑,1v1的情况还是不好处理呀

1v1确实难办,只能服务端跑一遍逻辑

帧同步还搞小数?还能同步吗…

你还没理解我的意思,跟跳帧不跳帧无关。

是后端要按一定频率发一个逻辑帧给各个客户端,逻辑帧上带有帧的编号(1,2,3,…),每帧逻辑帧上带有要转发的每个客户端的输入,如键盘,摇杆,点击等输入,还有随机种子。每个客户端的游戏逻辑就跑在服务端发过来的逻辑帧上,用帧附带的各个玩家的输入信息和随机种子算出相同的游戏逻辑。

要转发的只要输入信息,没有游戏角色信息,所以帧同步跟场景单位数量无关,10个单位和1000个单位,要转发的数据量是相同的,都是你的输入操作。不可能能做10个单位的帧同步游戏却做不了1000个单位的。

你现在还是坚持用互相转发玩家角色的逻辑信息给别的客户端的做法还不是帧同步。你的做法只是让每个客户端看到相同的角色位置,当要做逻辑判断的时候就不知道怎么实现了,比如:碰撞判断,技能cd,扣血加血,角色死亡,游戏是否已经结束。

1赞

没问题的,小数运算有误差,但不会说差的很多的,保留几位小数是最有效简便快捷的,尤其是你想用物理引擎的时候。

1赞

给大佬递茶,解释的很通俗易懂

这等于脚踩香蕉皮呀,靠谱点的帧同步每帧都要算hash的,不算hash你咋知道你的帧同步有没有严格同步呢。但算了hash,就必然不能用小数运算。

假设在,MOBA游戏中地图是10000*10000的,实际双方显示的坐标差2-3个像素,你觉得问题大吗?实际上没一点问题的,主要是碰撞要算得对就行了

1赞

玩家A 在自己的客户端显示的位置是(1000,0),在客户端B显示的位置是(999,0),一颗子弹刚好从(1000,y)的位置垂直飞过,这时在客户端A击中了A,在客户端B没击中A。

这时你还认为差1个2个像素没问题吗。别说是1个像素了,相差0.01个像素都不行,这就是为什么要使用定点数的原因,尽量避免误差。

所以是脚踩香蕉皮呀,没遇到逻辑冲突的时候还好,遇到逻辑冲突的时候查都没法查。看楼上回答就知道

牛逼,先点赞收藏一波再研究

可以查,而且不产生逻辑错误,各客户端的计算结果是能一致的,不清楚你说的没法hash什么的是什么意思

如果有计算,那结果是是肯定不会完全一致的。
但是我的做法是,谁的属性的负责,比如说你发射的子弹,在我的客户端中,只是图片,不参与碰撞和计算,或者只碰撞不计算伤害,由你的客户端计算好然后广播结果给我。这样就能保持结果一致。PS:不考虑作弊

这样做有问题啊,B玩家的子弹不在A玩家做碰撞和逻辑运算,就会发生B玩家的子弹在A玩家客户端对A玩家穿身而过,过了1秒后(网络波动,接收数据时间不定),B玩家把伤害发过来,这时A才被计算伤害。

mark等于学会

我有个疑问,后台是怎么实现固定时间同步数据给客户端的。我想的是用定时器,但是定时器,就会有帧率问题,不一定每帧的间隔都一样吧?