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

看板GameDesign作者 (無)時間3年前 (2021/01/28 12:37), 3年前編輯推噓5(5018)
留言23則, 4人參與, 3年前最新討論串1/2 (看更多)
最近嘗試使用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
去依靠Unity的物理引擎來做出本來該自己做的其實是邪道..
01/29 22:37, 9F

01/29 22:47, 3年前 , 10F
結果跟原文完全沒關係抱歉Orz...
01/29 22:47, 10F

01/30 02:24, 3年前 , 11F
啊我理解錯,我在幹嘛 XD
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
一般有兩種做法,一種是控制變數常數,Client端物理表演,
01/31 14:07, 16F

01/31 14:07, 3年前 , 17F
Server端驗算 (目前常見短連線遊戲),一種是資料Server端
01/31 14:07, 17F

01/31 14:08, 3年前 , 18F
為主,Client僅依照Server端送下來的資訊作出表演,如何用
01/31 14:08, 18F

01/31 14:08, 3年前 , 19F
這些資訊讓表演逼真是另一個領域了
01/31 14:08, 19F

01/31 14:08, 3年前 , 20F
(MMO之類)
01/31 14:08, 20F

01/31 14:09, 3年前 , 21F
至於你說的作弊,作弊抓的到就好,指要讓他正常遊玩不會出
01/31 14:09, 21F

01/31 14:10, 3年前 , 22F
問題就沒關係,至於玩家不管用任何手段作弊,只要server端
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
文章代碼(AID): #1W4Zztgz (GameDesign)
文章代碼(AID): #1W4Zztgz (GameDesign)