【厚積薄發】如何計算吃雞遊戲的物理碰撞?

【厚積薄發】如何計算吃雞遊戲的物理碰撞?

來自專欄 UWA:簡單優化、優化簡單14 人贊了文章

這是第126篇UWA技術知識分享的推送。今天我們繼續為大家精選了若干和開發、優化相關的問題,建議閱讀時間10分鐘,認真讀完必有收穫。

UWA 問答社區:answer.uwa4d.com

UWA QQ群:465082844(僅限技術交流)

伺服器同步

Q:由於吃雞類遊戲需要強同步,很多時候可能使用幀同步,客戶端無法直接使用物理引擎,或者狀態同步情況下伺服器需要計算碰撞等。此時怎麼處理這部分的碰撞呢?數據結構又是怎樣呢?

A:如果讓我選擇技術方案的話,類似絕地求生這種3D自由視角的吃雞遊戲我絕對不會選擇幀同步,原因有:

1)射擊遊戲在玩家移動、開槍等操作上會有較強的手感體驗上的訴求,幀同步很難支持即時的操作反饋;

2)自由視角的吃雞雖然沒有戰爭迷霧,但是會有視距的問題,使用幀同步把所有信息廣播給玩家,外掛做起來簡單太容易,而吃雞手游中標定其他玩家位置這樣的外掛又有很大的優勢,所以本質上不適合。

不知道題主說的幀同步和我理解的幀同步是否一致。然後,基於狀態同步,伺服器可以跑物理,但是真實的物理完全在伺服器跑,對於伺服器的壓力太大,需要付出的成本過高,一台物理機也可能承載不了多少同時在線的玩家消耗,你要評估下運維的成本是否可以接受。常見的做法:

1)簡化3D物理,根據上下文狀態只做部分關鍵判定,比如類似命中這樣的。不過因為物理中的數據計算比較敏感,浮點誤差都可能導致結果不一致,這裡的工作量和坑應該都不少。

2)使用2D物理系統代替3D物理系統來做,在物理計算中去掉高度,只做2D的碰撞,結合專門的檢測進程,是一種可行的檢測方案,性價比比較高;

3)客戶端判定,伺服器驗證,先相信客戶端的判定,然後進行客戶端表現,然後伺服器基於數據做驗證,這裡可能會使用2D物理引擎,也可能在核心判定中再添加一些比如高度的信息等來做;

4)客戶端判定,加嚴格的反外掛方式,封號之類的。這種當然你也要可以判斷出來玩家作弊,判斷方式可以未必實時去做,類似幀同步放後面通過回放模擬來做也可以,這時候有可能可以使用3D物理的來做(經驗上依然不推薦,只是從實時變成離線,對於性能的要求沒有那麼高了,3D成為一個可能性)。

5)先不做,等遊戲火了有錢了再加,沒火的話,也沒什麼專業的外掛團隊來使壞。

至於數據結構,太細節了,根據需求自己設計吧。2D的直接集成開源的2D引擎就可以了。

感謝賈偉昊@UWA問答社區提供了回答

A2:同意賈工的觀點。順帶補充幾點:

1)這遊戲除了角色,還有非常多的第三方信息需要同步,包括:門、載具和物資等。如果是幀同步,那還得同步彈藥量和消耗品等等...即使是端游,也是信息量巨大。所以用狀態同步比較現實。

2)不是特別熟悉虛幻引擎,而虛幻引擎用了NVIDIA的Physx,市面上的吃雞手游應該都是以此為基礎做的,那麼伺服器如何實時或離線運算Physx應該也是有參考的。聯想到之前有篇關於守望先鋒中同步平滑的文章,題主可以去參考下。

3)其實物理碰撞不是啥大問題,外掛中自瞄和透視才是大問題。早期的PUBG連人物移速都不驗證的,為了物理碰撞而採用幀同步,可能其他方面踩的坑要更多。

感謝史雲柯@UWA問答社區提供了回答

A3:感覺樓上已經解答的很好了,補充一個反外掛的辦法吧:可以把本來需要在伺服器進行的複雜運算,先讓涉及到的客戶端發一個結果,再將結果和運算及參數發到若干客戶端來執行,再做投票驗證,這樣可以降低一些伺服器的負載。

感謝郭瑞@UWA問答社區提供了回答

A4:我再補充一篇來自ValveSoftware的技術文檔《Source Multiplayer Networking》:

Source Multiplayer Networking?

developer.valvesoftware.com圖標

這篇也是基於狀態同步架構的。裡面提到的延遲補償和客戶端輸入預測技術,是目前比較主流的、用來對抗延遲帶來的糟糕體驗的方法。

感謝張銳@UWA問答社區提供了回答

A5:吃雞玩家數量一般在100個以上,這種情況下用幀同步需要同步的數據量會很大,延遲也會比較嚴重。因為幀同步一般需要收集所有同場景玩家的輸入,然後分發給各個客戶端,讓各個客戶端用相同的邏輯自己去計算每個玩家的位置、狀態,遊戲邏輯是跑在客戶端的。MOBA適合使用幀同步是因為一場比賽只有10個玩家。

我覺得吃雞還是適合狀態同步。狀態同步怕的是角色太多,導致需要同步狀態的角色過多,造成網路同步數據量大。吃雞沒有什麼野怪,全部是玩家,所以場景里角色就是玩家。可拾取的裝備需要同步的數據比較少,基本上需要一個位置坐標就行了,玩家身上的狀態數據量要多很多。客戶端看不見的玩家、裝備,完全可以不用同步,因為邏輯完全跑在伺服器端,客戶端只需按照伺服器的邏輯做繪製就行了。

關於遊戲手感的問題,FPS遊戲對延遲的要求是所有遊戲類型中最高的。如果玩家網路不是很好,也很難優化到比較好的情況。客戶端先行可以先做顯示的預判例如:擊中後的血跡。但是數值結果還是依靠伺服器端的計算,否則很容易被外掛利用。即使伺服器結果判定沒有打中,問題也不是很大,最多就是玩家看到有幾槍打中有血跡特效,但是對方沒扣血。這種情況大概率出現在網路環境不好的情況。

感謝ZFK@UWA問答社區提供了回答

該問答來自問答社區,歡迎大家轉至社區進一步交流:

吃雞類遊戲地形碰撞等伺服器端怎麼計算呢 - UWA問答: 侑虎科技官方問答社區?

answer.uwa4d.com圖標

計算精度

Q:我的項目在坐標比較大(20000,0,20000)的時候有如下2個問題:

1)模型移動會發現輕微抖動;

2)安卓上鏡頭轉動時發現模型閃爍,只有安卓這樣,iOS和PC正常。Unity版本2017.4.2,測試工程已經上傳至UWA問答社區。

A1:

http://www.songho.ca/opengl/gl_projectionmatrix.html?

www.songho.ca

在NDC空間中,離近切面近的點,Z的精度會比較高,離遠切面近的點,Z的精度會很低。如果遠切面的值過大,那麼就會容易出現Z-Fighting。基於透視原理,基本上這個問題是無解的。只能考慮曲線救國的方法繞過這個問題。

感謝凱奧斯@UWA問答社區提供了回答

A2:補充個現成參考方案:World Streamer

World Streamer - Asset Store?

assetstore.unity.com圖標

這個是個超大世界Streaming的完整解決方案,裡頭也實現了一個Floating Point Fix功能,就是解決坐標過大導致精度不足的問題。具體的做法大家也提到了,就是把世界的坐標拉回來,另外NavMesh這塊會有坑,最新版的World Streamer已經支持Unity 5.6+的NavMesh移動。實現代碼可參考裡頭的WorldMover.cs。用法可以參考他們文檔Floating Point Fix System的說明。

http://indago.homenko.pl/wp-content/uploads/2016/08/World-Streamer-Manual.pdf?

indago.homenko.pl

感謝招文勇@UWA問答社區提供了回答

該回答由UWA提供,歡迎大家轉至社區交流:

坐標比較大的時候模型抖動閃爍 - UWA問答: 侑虎科技官方問答社區?

answer.uwa4d.com圖標

渲染

Q:我們項目在做優化,之前是在遊戲內將場景渲染在一張較小的RenderTexture上最後翻回BackBuffer,但是這樣還是會多出來一次RenderTexture的拷貝。從我以往的經驗來看,可以直接修改BackBuffer的默認尺寸,這樣就可以避免一次RenderTexture的拷貝同時也減小RenderTexture的尺寸,不知道Unity在Android上是否可以直接修改BackBuffer的尺寸。我們使用的是Unity 5.5.4,希望大神解答一下。其實這個就類似與高版本Unity的DPI設置,但是我們現在無法更新Unity版本。

A:有個思路是硬改安卓層Surface的大小,是否可行還有兼容性問題需要驗證。

另外隱約記得降低解析度的時候Unity有個輸出,不支持硬體縮放的情況下才會走Blit的方式,Logcat里的輸出是這個:

Hardware resolution scaling not supported, falling back to software scaling (blit).

相關資料(後半部分):

Standard Shader for Mobile?

forum.unity.com圖標

建議直接調低解析度,安卓上Unity會有個嘗試硬體縮放的過程。

另外,Unity 5在安卓上總是會有一次全屏Blit的,並不會直接往BackBuffer里繪製。

相關參考:

BIG Performance Issue with Unity5 on Android !!!?

forum.unity.com圖標

感謝littlesome@UWA問答社區提供了回答,歡迎大家轉至社區交流:

修改BackBuffer默認尺寸 - UWA問答: 侑虎科技官方問答社區?

answer.uwa4d.com圖標

渲染

Q:我想了解下,PostProcessing 的Bloom,只開一個Layer和開所有Layer的消耗是一樣的嗎?因為是屏幕後特效,它只取渲染完成後的圖片做一次處理,所以想確認下自己的測試是否正確。

UWA:官方Github上的文檔是這麼說的:

這個Layer跟Unity其他地方的Layer作用類似,是用來做Filter的,所以渲染的效率是不影響,但是對於不需要Bloom的相機還是可以設置一下把它屏蔽掉,這樣可以更高效。

該回答由UWA提供,歡迎大家轉至社區進一步交流:

PostProcessing 的Bloom,只開一個Layer和開所有Layer的消耗是一樣的嗎??

answer.uwa4d.com圖標

今天的分享就到這裡。當然,生有涯而知無涯。在漫漫的開發周期中,您看到的這些問題也許都只是冰山一角,我們早已在UWA問答網站上準備了更多的技術話題等你一起來探索和分享。歡迎熱愛進步的你加入,也許你的方法恰能解別人的燃眉之急;而他山之「石」,也能攻你之「玉」。

官網:www.uwa4d.com

官方技術博客:blog.uwa4d.com

官方問答社區:answer.uwa4d.com

官方技術QQ群:465082844(僅限技術交流)

封面圖片來自網路

推薦閱讀:

伺服器被肉雞如何解決?
進階篇3-道具
Dev無感Ops,如何做到高效軟體交付
React v16.4.0發布
「頭腦吃雞」抄襲「頭腦王者」?答題遊戲千千萬,他倆好上了?

TAG:遊戲 | 遊戲從業者 |