日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

如何计算吃鸡游戏的物理碰撞?

發布時間:2023/12/20 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 如何计算吃鸡游戏的物理碰撞? 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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

UWA 問答社區:answer.uwa4d.com
UWA QQ群:465082844(僅限技術交流)


服務器同步

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

A1:如果讓我選擇技術方案的話,類似絕地求生這種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》:
https://developer.valvesoftware.com/wiki/Source_Multiplayer_Networking
這篇也是基于狀態同步架構的。里面提到的延遲補償和客戶端輸入預測技術,是目前比較主流的、用來對抗延遲帶來的糟糕體驗的方法。
感謝張銳@UWA問答社區提供了回答

A5:吃雞玩家數量一般在100個以上,這種情況下用幀同步需要同步的數據量會很大,延遲也會比較嚴重。因為幀同步一般需要收集所有同場景玩家的輸入,然后分發給各個客戶端,讓各個客戶端用相同的邏輯自己去計算每個玩家的位置、狀態,游戲邏輯是跑在客戶端的。MOBA適合使用幀同步是因為一場比賽只有10個玩家。
我覺得吃雞還是適合狀態同步。狀態同步怕的是角色太多,導致需要同步狀態的角色過多,造成網絡同步數據量大。吃雞沒有什么野怪,全部是玩家,所以場景里角色就是玩家。可拾取的裝備需要同步的數據比較少,基本上需要一個位置坐標就行了,玩家身上的狀態數據量要多很多。客戶端看不見的玩家、裝備,完全可以不用同步,因為邏輯完全跑在服務器端,客戶端只需按照服務器的邏輯做繪制就行了。
關于游戲手感的問題,FPS游戲對延遲的要求是所有游戲類型中最高的。如果玩家網絡不是很好,也很難優化到比較好的情況。客戶端先行可以先做顯示的預判例如:擊中后的血跡。但是數值結果還是依靠服務器端的計算,否則很容易被外掛利用。即使服務器結果判定沒有打中,問題也不是很大,最多就是玩家看到有幾槍打中有血跡特效,但是對方沒扣血。這種情況大概率出現在網絡環境不好的情況。
感謝ZFK@UWA問答社區提供了回答

該問答來自問答社區,歡迎大家轉至社區進一步交流:
https://answer.uwa4d.com/question/5a90c4960b827e2c0bfdcfc4


計算精度

Q2:我的項目在坐標比較大(20000,0,20000)的時候有如下2個問題:
1)模型移動會發現輕微抖動;
2)安卓上鏡頭轉動時發現模型閃爍,只有安卓這樣,iOS和PC正常。Unity版本2017.4.2,測試工程已經上傳至UWA問答社區。

A1:

http://www.songho.ca/opengl/gl_projectionmatrix.html
在NDC空間中,離近切面近的點,Z的精度會比較高,離遠切面近的點,Z的精度會很低。如果遠切面的值過大,那么就會容易出現Z-Fighting。基于透視原理,基本上這個問題是無解的。只能考慮曲線救國的方法繞過這個問題。
感謝凱奧斯@UWA問答社區提供了回答

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

該回答由UWA提供,歡迎大家轉至社區交流:
https://answer.uwa4d.com/question/5afb8a326b104d27ac3aad62


渲染

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

有個思路是硬改安卓層Surface的大小,是否可行還有兼容性問題需要驗證。
另外隱約記得降低分辨率的時候Unity有個輸出,不支持硬件縮放的情況下才會走Blit的方式,Logcat里的輸出是這個:
Hardware resolution scaling not supported, falling back to software scaling (blit).
相關資料(后半部分):
https://forum.unity.com/threads/standard-shader-for-mobile.368672
建議直接調低分辨率,安卓上Unity會有個嘗試硬件縮放的過程。
另外,Unity 5在安卓上總是會有一次全屏Blit的,并不會直接往BackBuffer里繪制。
相關參考:https://forum.unity.com/threads/big-performance-issue-with-unity5-on-android.338847

感謝littlesome@UWA問答社區提供了回答,歡迎大家轉至社區交流:
https://answer.uwa4d.com/question/5b7fc7b01e88b37d34e65361


渲染

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

官方Github上的文檔是這么說的:

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

該回答由UWA提供,歡迎大家轉至社區進一步交流:
https://answer.uwa4d.com/question/5b7b702c339d267d357c6e00

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

官網:www.uwa4d.com
官方技術博客:blog.uwa4d.com
官方問答社區:answer.uwa4d.com
官方技術QQ群:465082844(僅限技術交流)

總結

以上是生活随笔為你收集整理的如何计算吃鸡游戏的物理碰撞?的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。