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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

网络游戏之快照插值物理模拟

發(fā)布時(shí)間:2023/12/29 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 网络游戏之快照插值物理模拟 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

筆者介紹:姜雪偉,IT公司技術(shù)合伙人,IT高級(jí)講師,CSDN社區(qū)專(zhuān)家,特邀編輯,暢銷(xiāo)書(shū)作者,已出版書(shū)籍:《手把手教你架構(gòu)3D游戲引擎》電子工業(yè)出版社和《Unity3D實(shí)戰(zhàn)核心技術(shù)詳解》電子工業(yè)出版社等。

CSDN視頻網(wǎng)址:http://edu.csdn.net/lecturer/144

我們使用幀同步網(wǎng)絡(luò)物理模擬 現(xiàn)在,在這篇文章中,我們將使用完全不同的技術(shù)對(duì)相同的仿真進(jìn)行網(wǎng)絡(luò)連接:快照插值。

隨著玩家數(shù)量的增加,幀同步驟變得有問(wèn)題:您無(wú)法模擬幀n,直到您從所有玩家接收到該幀的輸入,所以玩家

最終等待最落后的玩家。 因此,我至多為2-4名玩家推薦幀同步技術(shù),這也是幀同步廣泛應(yīng)用于競(jìng)技游戲的原因

所以如果你的模擬不是確定性的,或者你想要更高的玩家數(shù)量,那么你需要一種不同的技術(shù)。 快照插非常適合。

在許多方面與幀同步相反:幀同步運(yùn)行兩個(gè)模擬,一個(gè)在左邊和一個(gè)在右邊,并使用同步輸入保持它們同步,快照插值不運(yùn)行任何模擬 右邊一切!快照

插值不運(yùn)行任何模擬右邊一切!

相反,我們從左側(cè)的仿真中捕獲所有相關(guān)狀態(tài)的快照,并將其傳輸?shù)接覀?cè),然后在右側(cè),我們使用這些快照重建模擬

的視覺(jué)近似,所有這些都不運(yùn)行模擬本身。讓我們發(fā)送渲染每個(gè)立方體所需的狀態(tài):

struct CubeState{bool interacting;vec3f position;quat4f orientation;}; 現(xiàn)在我已經(jīng)確定,這項(xiàng)技術(shù)的成本增加了帶寬使用。 大幅增加帶寬使用率。 由于快照包含整個(gè)模擬的視覺(jué)狀態(tài),

有了一些數(shù)學(xué),我們可以看到每個(gè)立方體可以串行化到225位或28.1字節(jié)。 由于在我們的模擬中有900個(gè)立方體,

這意味著每個(gè)快照大概是25千字節(jié)。

當(dāng)我們以分組的形式發(fā)送快照數(shù)據(jù)時(shí),我們?cè)陧敳堪粋€(gè)16位序列號(hào)。 該序列號(hào)從零開(kāi)始,并隨著發(fā)送的每

個(gè)分組而增加。 我們?cè)诮邮諘r(shí)使用此序列號(hào)來(lái)確定數(shù)據(jù)包中的快照是否比接收的最近快照更新或更早。 如果它更老,

那么它被丟棄。

我們只是渲染右邊收到的最新快照:

仔細(xì)觀察,即使我們盡快發(fā)送數(shù)據(jù)(每幀一個(gè)數(shù)據(jù)包),您仍然可以看到右側(cè)的掛起。 這是因?yàn)榛ヂ?lián)網(wǎng)不能保證每秒發(fā)送60次

的數(shù)據(jù)包相當(dāng)于1/60秒的間隔。 數(shù)據(jù)包抖動(dòng)。 一些幀您收到兩個(gè)快照數(shù)據(jù)包。 其他你沒(méi)有收到。

這實(shí)際上是一個(gè)很常見(jiàn)的事情,當(dāng)你第一次開(kāi)始網(wǎng)絡(luò)。 您開(kāi)始在局域網(wǎng)上玩游戲,并注意到您可以快速地砰擊包(60pps),

并且大部分時(shí)間您的游戲看起來(lái)很棒,因?yàn)樵贚AN上,這些數(shù)據(jù)包實(shí)際上往往以與他們發(fā)送的相同速率達(dá)到.。

首先,我們來(lái)看看我們用這種天真的方法發(fā)送多少帶寬。 每個(gè)數(shù)據(jù)包是25312.5字節(jié)加上28個(gè)字節(jié)的IP + UDP頭和2個(gè)字節(jié)的

序列號(hào)。 每個(gè)數(shù)據(jù)包為25342.5字節(jié),每秒60個(gè)數(shù)據(jù)包,總共每秒1520550字節(jié)或11.6兆比特/秒。 現(xiàn)在肯定有互聯(lián)網(wǎng)連接,可以支

持這么多的流量...但是,老實(shí)說(shuō),我們并沒(méi)有真正得到很多好處爆炸數(shù)據(jù)包每秒60秒,所有的抖動(dòng),讓我們拉回來(lái) 每秒只發(fā)送10

個(gè)快照:

你可以看到 在右邊沒(méi)那么好,但是至少我們已經(jīng)將帶寬降低了6到2兆比特/秒。 我們肯定是朝著正確的

方向前進(jìn)。

現(xiàn)在用快照的技巧。 我們所做的是,不是立即呈現(xiàn)接收的快照數(shù)據(jù),就是我們?cè)趦?nèi)插緩沖區(qū)中緩沖快照

時(shí)間短。 此插值緩沖區(qū)會(huì)持續(xù)快照一段時(shí)間,以便您不僅具有要呈現(xiàn)的快照,而且從統(tǒng)計(jì)學(xué)角度來(lái)看,您也

很可能擁有下一個(gè)快照。 然后,隨著右側(cè)時(shí)間的推移,我們?cè)趦蓚€(gè)稍微延遲的快照之間插入位置和方向,提

供平滑運(yùn)動(dòng)的幻覺(jué)。 實(shí)際上,我們已經(jīng)為平滑度交易了少量的延遲。

您可能會(huì)驚訝于使用線性插10pps看起來(lái)有多好:

現(xiàn)在我們要處理丟包了,我確定你可以看到為什么我們永遠(yuǎn)不會(huì)考慮通過(guò)TCP發(fā)送快照。

快照時(shí)間關(guān)鍵的,但不同于幀同步快照中的輸入不需要可靠 如果快照丟失,我們可以跳過(guò)它,

并插入內(nèi)插緩沖區(qū)中的更新的快照 我們不想停止,等待丟失的快照包被重新發(fā)送。 這就是為什么你應(yīng)該始終

使用UDP發(fā)送快照。

上述的線性和高音插值畫(huà)面不僅以每秒10包的發(fā)送速率記錄,而且還記錄在5%的分組丟失,+/- 2幀的抖動(dòng)(60fps)。

如何處理這些視頻的數(shù)據(jù)包丟失和抖動(dòng)是通過(guò)簡(jiǎn)單地確保在插值之前在插值緩沖區(qū)中保存適當(dāng)時(shí)間的快照。

我的經(jīng)驗(yàn)法則是內(nèi)插緩沖區(qū)應(yīng)該有足夠的延遲,這樣我可以連續(xù)丟失兩個(gè)數(shù)據(jù)包,并且仍然有一些插值。 實(shí)際上,

我發(fā)現(xiàn)在2-5%數(shù)據(jù)包丟失時(shí)效果最佳的延遲量是數(shù)據(jù)包發(fā)送速率的3倍。 每秒10個(gè)數(shù)據(jù)包,這是300ms。 我還需要一些

額外的延遲來(lái)處理抖動(dòng),在我的經(jīng)驗(yàn)中,通常只有一個(gè)或兩個(gè)幀(60fps),所以上面的插值視頻以350ms的延遲被記錄。

添加350毫秒延遲似乎很多 但是每次數(shù)據(jù)包丟失時(shí),您最終會(huì)掛起1/10秒。 人們

經(jīng)常用來(lái)隱藏內(nèi)插緩沖區(qū)在其他區(qū)域(如FPS,飛行模擬器,賽車(chē)游戲等)中添加的延遲的一種技術(shù)是使用外推法。 但是

根據(jù)經(jīng)驗(yàn),外推對(duì)于剛體是不正常的,因?yàn)樗鼈兊膭?dòng)作是非線性的和不可預(yù)測(cè)的。 在這里,您可以看到200ms的外推,

將總時(shí)延從350 ms縮短到僅150ms:

外推對(duì)物理模擬不了解 外推不知道與地板的碰撞,所以立方體可以向下推出地板,然后彈回來(lái)糾正。

預(yù)測(cè)不知道彈簧力將玩家立方體放在空中,所以立方體最初向上移動(dòng)比它應(yīng)該更慢,并且必須抓住。 它也不知道

任何關(guān)于碰撞和碰撞反應(yīng)如何工作,所以立方體滾動(dòng)在地板和其他立方體也是錯(cuò)誤的。 最后,如果你看到球,

你將會(huì)看到,外推可以預(yù)測(cè)所附立方體當(dāng)它們與播放器立方體一起旋轉(zhuǎn)時(shí),沿其切線速度繼續(xù)移動(dòng)。

您可以想象,花費(fèi)大量的時(shí)間來(lái)提高這種外推的質(zhì)量,并使其了解立方體的各種運(yùn)動(dòng)模式。 您可以采取每個(gè)立方體,

并確保至少多維數(shù)據(jù)集不會(huì)通過(guò)地板。 您可以使用多邊形之間的邊界球添加一些近似碰撞檢測(cè)或響應(yīng)。 你甚至可以把這

個(gè)立方體放在卡塔馬里的球中,使他們預(yù)測(cè)運(yùn)動(dòng)與玩家立方體一起旋轉(zhuǎn)。

但是,即使你做了這一切,仍然會(huì)有錯(cuò)誤的預(yù)測(cè),因?yàn)槟愀緹o(wú)法準(zhǔn)確地匹配物理模擬和近似值。 如果您的模擬主要

是線性運(yùn)動(dòng),例如。 快速移動(dòng)的飛機(jī),船只,太空船 - 你可能會(huì)發(fā)現(xiàn)一個(gè)簡(jiǎn)單的外推在短時(shí)間內(nèi)(50-250ms左右)工作得很好,

但是根據(jù)經(jīng)驗(yàn),一旦物體開(kāi)始與其他非固定物體碰撞,外推開(kāi)始 分解。

我們?nèi)绾螠p少內(nèi)插的延遲量? 350ms仍然是不可接受的,我們不能使用外推來(lái)減少這種延遲,而不增加大量的不準(zhǔn)確性。

解決方案很簡(jiǎn)單:增加發(fā)送速率! 如果我們每秒發(fā)送30個(gè)快照,我們可以獲得相同數(shù)量的丟包保護(hù),延遲150ms。 每秒60個(gè)

數(shù)據(jù)包只需85ms。


總結(jié)

以上是生活随笔為你收集整理的网络游戏之快照插值物理模拟的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。