[程式] 前、後端物理運算一致性
最近嘗試使用Box2D做為物理引擎來模擬與製作遊戲(想要模仿怪物彈珠)
但遇到了前、後端同步的問題
為了避免前端直接傳送封包作弊
希望亂數與物理參數(速度、反作用力等)都是由後端產生
最後由前端直接帶入後端產生的參數並驅動Body產生結果
在物理引擎上前、後端皆使用fixed timestamp的方法去運行
狀況1:
場面上除了玩家操控的Body外
其他物件都是不會移動的(僅會產生物理碰撞)
玩家的操作會有隨機性並產生物理參數讓前端使用
一開始有使用CCD但在某些狀況下會導致前、後端的位置不一樣
後來去看了核心才發現主要原因是CCD所造成的
也因為遊戲世界中並沒有會高速移動的Body
所以就先將CCD的機制關閉
關閉後似乎就沒有再出現運算結果不一致的狀況
請問有辦法在開啟CCD的情況下也保持物理運算結果是一樣的嗎?
狀況2:
承上述的狀況1
但遊戲世界中增加了一些會自體來回移動的Body並影響玩家的操作結果
請問要如何讓前端只使用物理參數下可以達到運算結果一致?
以下提供我想到的解法
把後端在物理運算中每一個tick的結果保存下來傳送給前端演示
但這種做法會導致封包流量過大
以一秒鐘固定跑60個tick的狀況下
每一次動作可能產生5 ~ 6KB的流量
雖然可以讓前端完美重現但流量應該會爆炸
而且上面的做法假設碰到狀況2就完全無法適用
中間也有參考一些別人的遊戲
但有些遊戲似乎是讓前端去跑結果並且告知後端
請問這樣做不會容易發生作弊的狀況嗎?
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 220.134.195.1 (臺灣)
※ 文章網址: https://www.ptt.cc/bbs/GameDesign/M.1611808631.A.ABD.html
※ 編輯: bearnone (220.134.195.1 臺灣), 01/28/2021 13:05:50
→
01/28 17:26,
3年前
, 1F
01/28 17:26, 1F
→
01/28 17:26,
3年前
, 2F
01/28 17:26, 2F
推
01/28 18:38,
3年前
, 3F
01/28 18:38, 3F
→
01/28 18:39,
3年前
, 4F
01/28 18:39, 4F
你說的方法不知道是否是所謂的Client side prediction?
目前碰到的難題是
前端演示的畫面顯示該路徑是會得到獎勵的
但實際上跟後端的計算是有誤差的(後端的路徑並無實際碰到獎勵範圍)
如果最後前端依據後端(權威性)結果去做畫面修正
深怕玩家會來吵糖吃
推
01/29 10:39,
3年前
, 5F
01/29 10:39, 5F
→
01/29 10:40,
3年前
, 6F
01/29 10:40, 6F
你提及網路延遲的部分不知道跟我下面理解的是否一樣?
大部分即時的遊戲都會偵測延遲的狀況
並依照延遲的形況去做畫面修正
如果只是輕微延遲可能會利用補間的方式去修正
但是當延遲過大的時候則是將畫面停滯並且做大幅度的一次性修正
推
01/29 22:35,
3年前
, 7F
01/29 22:35, 7F
→
01/29 22:36,
3年前
, 8F
01/29 22:36, 8F
→
01/29 22:37,
3年前
, 9F
01/29 22:37, 9F
推
01/29 22:47,
3年前
, 10F
01/29 22:47, 10F
→
01/30 02:24,
3年前
, 11F
01/30 02:24, 11F
→
01/30 02:24,
3年前
, 12F
01/30 02:24, 12F
→
01/30 02:24,
3年前
, 13F
01/30 02:24, 13F
是說通常效能跟作弊一定要有所取捨嗎?
因為主要感興趣的部分是後端層面
所以對玩家作弊的部分會比較想要理解怎樣處理
推
01/31 14:06,
3年前
, 14F
01/31 14:06, 14F
→
01/31 14:06,
3年前
, 15F
01/31 14:06, 15F
→
01/31 14:07,
3年前
, 16F
01/31 14:07, 16F
→
01/31 14:07,
3年前
, 17F
01/31 14:07, 17F
→
01/31 14:08,
3年前
, 18F
01/31 14:08, 18F
→
01/31 14:08,
3年前
, 19F
01/31 14:08, 19F
→
01/31 14:08,
3年前
, 20F
01/31 14:08, 20F
→
01/31 14:09,
3年前
, 21F
01/31 14:09, 21F
→
01/31 14:10,
3年前
, 22F
01/31 14:10, 22F
→
01/31 14:10,
3年前
, 23F
01/31 14:10, 23F
請問你說的變數常數主要是控制哪些部分?(是指物理參數嗎?)
目前想到的方法好像是比較偏向你說的方法2
我打算在Client跟Server都用Box2D去創建一個遊戲世界(world)
並且讓Client跟Server端的world盡可能保持在一致的狀態
當玩家進行遊戲操作後
Client會將該操作的RPC封包送至後端
後端接收封包後後產生結果(使用物理引擎計算路徑並且包含亂數因素)並回傳前端作演示
但這樣似乎有可能會碰到浮點數精準的問題(?)
另外場面上如果有移動性的Body
似乎也會導致無法單靠物理參數就導出同樣的結果
另外想詢問如果要防止作弊的方法
有哪些常見的方式嗎?
謝謝
※ 編輯: bearnone (220.134.195.1 臺灣), 02/01/2021 14:43:51
討論串 (同標題文章)
GameDesign 近期熱門文章
PTT遊戲區 即時熱門文章