[程式] 前、后端物理运算一致性

楼主: bearnone (无)   2021-01-28 12:37:09
最近尝试使用Box2D做为物理引擎来模拟与制作游戏(想要模仿怪物弹珠)
但遇到了前、后端同步的问题
为了避免前端直接传送封包作弊
希望乱数与物理参数(速度、反作用力等)都是由后端产生
最后由前端直接带入后端产生的参数并驱动Body产生结果
在物理引擎上前、后端皆使用fixed timestamp的方法去运行
状况1:
场面上除了玩家操控的Body外
其他物件都是不会移动的(仅会产生物理碰撞)
玩家的操作会有随机性并产生物理参数让前端使用
一开始有使用CCD但在某些状况下会导致前、后端的位置不一样
后来去看了核心才发现主要原因是CCD所造成的
也因为游戏世界中并没有会高速移动的Body
所以就先将CCD的机制关闭
关闭后似乎就没有再出现运算结果不一致的状况
请问有办法在开启CCD的情况下也保持物理运算结果是一样的吗?
状况2:
承上述的状况1
但游戏世界中增加了一些会自体来回移动的Body并影响玩家的操作结果
请问要如何让前端只使用物理参数下可以达到运算结果一致?
以下提供我想到的解法
把后端在物理运算中每一个tick的结果保存下来传送给前端演示
但这种做法会导致封包流量过大
以一秒钟固定跑60个tick的状况下
每一次动作可能产生5 ~ 6KB的流量
虽然可以让前端完美重现但流量应该会爆炸
而且上面的做法假设碰到状况2就完全无法适用
中间也有参考一些别人的游戏
但有些游戏似乎是让前端去跑结果并且告知后端
请问这样做不会容易发生作弊的状况吗?
作者: dklassic (DK)   2021-01-28 17:26:00
最简单的方法就是你自己推算玩家的施力跟方向去算出移动路径与碰撞结果吧,而不是真的靠物理模拟去做
作者: wulouise (在线上!=在电脑前)   2021-01-28 18:38:00
你可以前端先算画面,最后后端再更新,不然一定慢大部分网络游戏的前端都有偷算,跟后段比差很多再拉会
作者: ddavid (谎言接线生)   2021-01-29 10:39:00
网络游戏常见的延迟造成瞬移就是这种前端预测跟后端实算有差异造成的结果,这几乎是必备技术了
作者: LayerZ (無法如願)   2021-01-29 22:35:00
唯一的变量只有玩家的角度与力道,其他所有都是常数不要太依赖物理特性了,物理特性应该是做出来的表现效果去依靠Unity的物理引擎来做出本来该自己做的其实是邪道..结果跟原文完全没关系抱歉Orz...
作者: dklassic (DK)   2021-01-30 02:24:00
啊我理解错,我在干嘛 XD前端先模拟是满正常的作法,这边效能跟作弊是一体两面的难题就只能看取舍了
作者: LayerZ (無法如願)   2021-01-31 14:06:00
认真回一下,基本上是不可能做到前后端同步的,如果做得到就已经突破云端游戏瓶颈了一般有两种做法,一种是控制变量常数,Client端物理表演,Server端验算 (目前常见短连线游戏),一种是资料Server端为主,Client仅依照Server端送下来的资讯作出表演,如何用这些资讯让表演逼真是另一个领域了(MMO之类)至于你说的作弊,作弊抓的到就好,指要让他正常游玩不会出问题就没关系,至于玩家不管用任何手段作弊,只要server端抓得出来(各种验算) 就能即时处理掉

Links booklink

Contact Us: admin [ a t ] ucptt.com