[程式] 前、後端物理運算一致性

作者: 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