看板 GameDesign 關於我們 聯絡資訊
最近嘗試使用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
dklassic: 最簡單的方法就是你自己推算玩家的施力跟方向去算出移 01/28 17:26
dklassic: 動路徑與碰撞結果吧,而不是真的靠物理模擬去做 01/28 17:26
wulouise: 你可以前端先算畫面,最後後端再更新,不然一定慢 01/28 18:38
wulouise: 大部分網路遊戲的前端都有偷算,跟後段比差很多再拉會 01/28 18:39
你說的方法不知道是否是所謂的Client side prediction? 目前碰到的難題是 前端演示的畫面顯示該路徑是會得到獎勵的 但實際上跟後端的計算是有誤差的(後端的路徑並無實際碰到獎勵範圍) 如果最後前端依據後端(權威性)結果去做畫面修正 深怕玩家會來吵糖吃
ddavid: 網路遊戲常見的延遲造成瞬移就是這種前端預測跟後端實算有 01/29 10:39
ddavid: 差異造成的結果,這幾乎是必備技術了 01/29 10:40
你提及網路延遲的部分不知道跟我下面理解的是否一樣? 大部分即時的遊戲都會偵測延遲的狀況 並依照延遲的形況去做畫面修正 如果只是輕微延遲可能會利用補間的方式去修正 但是當延遲過大的時候則是將畫面停滯並且做大幅度的一次性修正
LayerZ: 唯一的變數只有玩家的角度與力道,其他所有都是常數 01/29 22:35
LayerZ: 不要太依賴物理特性了,物理特性應該是做出來的表現效果 01/29 22:36
LayerZ: 去依靠Unity的物理引擎來做出本來該自己做的其實是邪道.. 01/29 22:37
LayerZ: 結果跟原文完全沒關係抱歉Orz... 01/29 22:47
dklassic: 啊我理解錯,我在幹嘛 XD 01/30 02:24
dklassic: 前端先模擬是滿正常的作法,這邊效能跟作弊是一體兩面 01/30 02:24
dklassic: 的難題就只能看取捨了 01/30 02:24
是說通常效能跟作弊一定要有所取捨嗎? 因為主要感興趣的部分是後端層面 所以對玩家作弊的部分會比較想要理解怎樣處理
LayerZ: 認真回一下,基本上是不可能做到前後端同步的,如果做得到 01/31 14:06
LayerZ: 就已經突破雲端遊戲瓶頸了 01/31 14:06
LayerZ: 一般有兩種做法,一種是控制變數常數,Client端物理表演, 01/31 14:07
LayerZ: Server端驗算 (目前常見短連線遊戲),一種是資料Server端 01/31 14:07
LayerZ: 為主,Client僅依照Server端送下來的資訊作出表演,如何用 01/31 14:08
LayerZ: 這些資訊讓表演逼真是另一個領域了 01/31 14:08
LayerZ: (MMO之類) 01/31 14:08
LayerZ: 至於你說的作弊,作弊抓的到就好,指要讓他正常遊玩不會出 01/31 14:09
LayerZ: 問題就沒關係,至於玩家不管用任何手段作弊,只要server端 01/31 14:10
LayerZ: 抓得出來(各種驗算) 就能即時處理掉 01/31 14:10
請問你說的變數常數主要是控制哪些部分?(是指物理參數嗎?) 目前想到的方法好像是比較偏向你說的方法2 我打算在Client跟Server都用Box2D去創建一個遊戲世界(world) 並且讓Client跟Server端的world盡可能保持在一致的狀態 當玩家進行遊戲操作後 Client會將該操作的RPC封包送至後端 後端接收封包後後產生結果(使用物理引擎計算路徑並且包含亂數因素)並回傳前端作演示 但這樣似乎有可能會碰到浮點數精準的問題(?) 另外場面上如果有移動性的Body 似乎也會導致無法單靠物理參數就導出同樣的結果 另外想詢問如果要防止作弊的方法 有哪些常見的方式嗎? 謝謝 ※ 編輯: bearnone (220.134.195.1 臺灣), 02/01/2021 14:43:51