如果你不上传,那么要做战绩数据统计的时候,你是否一样使用信任多数的方法?
信任多数是可以保证正确的,因为多数玩家一起作弊,而且作弊后的结果都一样的几率太低了。
那么你上传数据,这个数据的可靠性怎么保证,不依赖信任多数的机制吗?
如果还不理解帧同步的原理的话,我再举一个例子。
我们以前玩小霸王游戏的时候(80,90后玩过,00后不一定)。
1,一台机器有两个手柄,通过物理插口插入手柄就可以玩双人游戏了。
2,如果一个手柄不是通过物理接口接入,而是通过网络通信,接入你的机子(当然那时候的小霸王不具备这种能力),就是无线连接,也是可以玩双人游戏。
3,如果两台小霸王游戏机的手柄都是通过网络连接(通过服务器转发数据),互相接入对方机子,那么,两个手柄都可以给两台机器提供输入。
4,如果两台辑器的游戏帧都是一个服务器发过来的,游戏帧带有帧编号1…n…,两台游戏机的游戏都是运行在服务器的游戏帧上,那么两台机器就能联机玩对战游戏。
帧同步差不多就是这个原理,由服务器转发带有输入信息的游戏帧,各个客户端根据游戏帧和输入数据算出一样的结果。服务器不带任何游戏逻辑,只有转发输入。
我们一开始是使用信任多数,但后面好像是出了什么问题才改成这样的,不过现在想想这样也有问题
最可靠的是引入服务器做仲裁者,服务器跟着客户端一起跑帧逻辑,那么每一帧的hash都以服务器为准。不过服务器的负载就大了,叫老板多买几个机器做服务器。
信任多数已经能解决很多作弊问题了。场景有10个玩家,8个作弊,结果都不同,唯有其中两个人的结果相同,那就以这两个人的数据为准。这样的准确率有90%,想两个人作弊能做出相同的结果概率很低
暂时不考虑作弊的问题,这个有专门的方案应对,暂且完全相信客户端发的请求
如果服务器没有跑一遍逻辑,1v1的情况还是不好处理呀
1v1确实难办,只能服务端跑一遍逻辑
帧同步还搞小数?还能同步吗…
你还没理解我的意思,跟跳帧不跳帧无关。
是后端要按一定频率发一个逻辑帧给各个客户端,逻辑帧上带有帧的编号(1,2,3,…),每帧逻辑帧上带有要转发的每个客户端的输入,如键盘,摇杆,点击等输入,还有随机种子。每个客户端的游戏逻辑就跑在服务端发过来的逻辑帧上,用帧附带的各个玩家的输入信息和随机种子算出相同的游戏逻辑。
要转发的只要输入信息,没有游戏角色信息,所以帧同步跟场景单位数量无关,10个单位和1000个单位,要转发的数据量是相同的,都是你的输入操作。不可能能做10个单位的帧同步游戏却做不了1000个单位的。
你现在还是坚持用互相转发玩家角色的逻辑信息给别的客户端的做法还不是帧同步。你的做法只是让每个客户端看到相同的角色位置,当要做逻辑判断的时候就不知道怎么实现了,比如:碰撞判断,技能cd,扣血加血,角色死亡,游戏是否已经结束。
没问题的,小数运算有误差,但不会说差的很多的,保留几位小数是最有效简便快捷的,尤其是你想用物理引擎的时候。
给大佬递茶,解释的很通俗易懂
这等于脚踩香蕉皮呀,靠谱点的帧同步每帧都要算hash的,不算hash你咋知道你的帧同步有没有严格同步呢。但算了hash,就必然不能用小数运算。
假设在,MOBA游戏中地图是10000*10000的,实际双方显示的坐标差2-3个像素,你觉得问题大吗?实际上没一点问题的,主要是碰撞要算得对就行了
玩家A 在自己的客户端显示的位置是(1000,0),在客户端B显示的位置是(999,0),一颗子弹刚好从(1000,y)的位置垂直飞过,这时在客户端A击中了A,在客户端B没击中A。
这时你还认为差1个2个像素没问题吗。别说是1个像素了,相差0.01个像素都不行,这就是为什么要使用定点数的原因,尽量避免误差。
所以是脚踩香蕉皮呀,没遇到逻辑冲突的时候还好,遇到逻辑冲突的时候查都没法查。看楼上回答就知道
牛逼,先点赞收藏一波再研究
可以查,而且不产生逻辑错误,各客户端的计算结果是能一致的,不清楚你说的没法hash什么的是什么意思