求生玩家必備知識(shí)之——net_graph
求生玩家必備知識(shí)之——net_graph
內(nèi)容目錄(由[TOC]自動(dòng)生成)
一、net_graph的概念二、Network Graph命令參數(shù)三、Network Graph面板詳解四、拓展內(nèi)容
一、net_graph的概念
net_graph
是source引擎的一個(gè)命令,使用它可以打開(kāi)一個(gè)面板用于查看網(wǎng)絡(luò)性能相關(guān)參數(shù)。通過(guò)它,我們可以直觀地了解當(dāng)前客戶端與服務(wù)端之間的網(wǎng)絡(luò)通信情況與服務(wù)器運(yùn)行的一些信息。
這是它的樣子:

具體Valve開(kāi)發(fā)者文檔中沒(méi)有單獨(dú)設(shè)立頁(yè)面,但是有一篇跳轉(zhuǎn)的頁(yè)面是TF2 Network Graph,即軍團(tuán)要塞2的net_graph講解,兩者使用同樣的引擎,應(yīng)該是一致的:
https://developer.valvesoftware.com/wiki/TF2_Network_Graph
有興趣可以去仔細(xì)閱讀一下文檔,下面我詳細(xì)介紹一下net graph:
二、Network Graph命令參數(shù)
懶得看解釋直接抄作業(yè)版(我的配置是net graph面板剛好在右下角人物頭像左邊):
net_graph
用于配置net_graph顯示方式的基本命令:
- 0 = 不顯示(默認(rèn))
- 1 = 繪制基本網(wǎng)圖(僅文本)[區(qū)域 3、4、6 和 7]
- 2 = 繪制有效負(fù)載數(shù)據(jù)以及延遲和插值圖 [區(qū)域 8 和 9]
- 3 = 繪制有效負(fù)載圖例 [區(qū)域 1] 以及數(shù)據(jù)包丟失百分比和阻塞數(shù)據(jù)包百分比 [區(qū)域 4]
- 4 = 繪制服務(wù)器性能統(tǒng)計(jì)區(qū)域 [區(qū)域 5]
net_graphpos
圖形的位置。它始終位于屏幕底部。
- 0 = 左邊緣
- 1 = 右邊緣
- 2 = 居中
- 3 或更高指定圖形左邊緣的 X 坐標(biāo)
net_graphproportionalfont
確定網(wǎng)圖字體是否成比例(即,在以更高分辨率運(yùn)行時(shí)是否嘗試使用較大的字體)
net_scale
改變net_graph的有效負(fù)載部分的比例
三、Network Graph面板詳解
文檔中有一張圖將面板標(biāo)記為了9個(gè)區(qū)域:

一共可以劃分為九個(gè)區(qū)域,不過(guò)其中并不是全部都需要了解是什么作用。
區(qū)域 5 [服務(wù)器性能參考]
此區(qū)域顯示客戶端連接到的服務(wù)器的性能?!皊v”標(biāo)記顯示截至交付給客戶端的最新網(wǎng)絡(luò)更新時(shí)服務(wù)器的 fps?!皏ar”顯示服務(wù)器在服務(wù)器記錄的最后 1 幀中的幀時(shí)間(其中服務(wù)器 fps = 0.50 / 幀時(shí)間)的標(biāo)準(zhǔn)偏差。如果服務(wù)器的幀速率低于 20 fps,則此線將以黃色繪制。如果服務(wù)器的幀速率低于 10 fps,則此行將繪制為紅色。
區(qū)域 6 [Lerp設(shè)置]
“l(fā)erp”指示器顯示客戶端使用的插值毫秒數(shù)。其值由cl_interp值控制。
區(qū)域 7 [Tick設(shè)置]
此區(qū)域顯示用戶的當(dāng)前cl_updaterate設(shè)置、每秒從服務(wù)器實(shí)際接收的實(shí)際更新數(shù)、每秒發(fā)送到服務(wù)器的實(shí)際數(shù)據(jù)包數(shù)以及用戶的cl_cmdrate設(shè)置(即用戶每秒希望發(fā)送到服務(wù)器的數(shù)據(jù)包)。
cl_updaterate
客戶端每秒向服務(wù)器請(qǐng)求更新的頻率,即世界快照- 服務(wù)器下行Tick
- 客戶端上行Tick [ 該值會(huì)受客戶端本身fps影響,他等于每秒向服務(wù)器發(fā)送的本地世界變化的快照 ]
cl_cmdrate
客戶端每秒向服務(wù)器發(fā)送的命令頻率,即操作數(shù)據(jù)
另外服主需要額外注意的部分:
區(qū)域 8 [網(wǎng)絡(luò)連接質(zhì)量]
當(dāng)net_graphshowlatency為 1 時(shí),此區(qū)域顯示連接延遲的歷史視圖。高度(由標(biāo)記“d”表示)對(duì)應(yīng)于net_graphmsecs時(shí)間(實(shí)際上,在頂部net_graphmsecs后有一點(diǎn)凈空,以便文本字段適合)。紅色垂直線表示從服務(wù)器向下到客戶端的丟棄數(shù)據(jù)包。如果圖形顯示黃色標(biāo)記(例如標(biāo)記“c”處),則表示服務(wù)器在向客戶端發(fā)送更新之前必須阻塞一個(gè)或多個(gè)數(shù)據(jù)包。
至此,Network Graph的功能你已基本了解,下面是一些拓展內(nèi)容。
四、拓展內(nèi)容
source引擎多人游戲的的網(wǎng)絡(luò)設(shè)計(jì)
在Vavle的開(kāi)發(fā)者文檔中,有這么一篇關(guān)于source引擎多人游戲網(wǎng)絡(luò)的頁(yè)面:
為了應(yīng)對(duì)網(wǎng)絡(luò)通信引入的問(wèn)題,source引擎采用了客戶端不可見(jiàn)的數(shù)據(jù)壓縮和滯后補(bǔ)償?shù)燃夹g(shù)。通過(guò)執(zhí)行預(yù)測(cè)和插值以進(jìn)一步改善體驗(yàn)。
注意這其中的關(guān)鍵信息:“滯后補(bǔ)償”、“插值”。
這其中引入的技術(shù)需要我們了解的是“實(shí)體插值”和“滯后補(bǔ)償”。
"實(shí)體插值"
默認(rèn)情況,客戶端每秒接收大約20個(gè)快照,如果說(shuō)游戲中的實(shí)體僅在服務(wù)器接收的位置渲染,即等待玩家的數(shù)據(jù)包到達(dá)服務(wù)器之后才進(jìn)行渲染,就會(huì)導(dǎo)致服務(wù)器和客戶端的實(shí)體位置無(wú)法匹配,導(dǎo)致斷斷續(xù)續(xù)和抖動(dòng),丟棄的數(shù)據(jù)包也會(huì)導(dǎo)致同樣的故障。為了解決此問(wèn)題,訣竅是回到過(guò)去進(jìn)行渲染,當(dāng)然我們無(wú)法回到過(guò)去,所以引入了實(shí)體插值的方法。具體實(shí)現(xiàn)方法就位置和動(dòng)畫(huà)可以在兩個(gè)最近收到的快照之間連續(xù)插值。每秒20個(gè)快照,則大約50ms就會(huì)到達(dá)一次更新,因此我們將客戶端的渲染時(shí)間向后偏移50ms,也就是說(shuō)讓客戶端看見(jiàn)的畫(huà)面延遲50ms,換言之就是客戶端看到的畫(huà)面實(shí)際上是50ms前渲染的世界,這樣就有機(jī)會(huì)在兩次世界快照之間進(jìn)行插值,以解決畫(huà)面斷斷續(xù)續(xù)和抖動(dòng)的問(wèn)題。
注意,source引擎默認(rèn)使用100ms進(jìn)行插值,這樣即使丟失了一個(gè)快照,也有兩個(gè)有效的快照用于在其中進(jìn)行插值。這張圖就展示了source引擎插值的工作原理:

在這一篇文章中,找到關(guān)于cl_interp的設(shè)置:“https://developer.valvesoftware.com/wiki/Interpolation”,其中有一句話說(shuō):“Players should set , as this will ensure that the lerp is the precise length needed to accommodate the current server update rate. Raising the update rate will reduce lerp further.cl_interp 0
”,即玩家最好將lerp設(shè)置為0,從而自動(dòng)匹配Cl updaterate。
注意!如果服務(wù)器的nb_update_freqency值不夠低,即Next bot的值不夠低的話,會(huì)導(dǎo)致刷新普通感染者的路徑頻率過(guò)慢,從而導(dǎo)致普通感染者的斷斷續(xù)續(xù)和抖動(dòng),即所謂的小僵尸閃現(xiàn)。
"滯后補(bǔ)償" [用就行了,好東西]
這個(gè)概念就是服務(wù)器會(huì)保存1秒以內(nèi)所有玩家的位置信息,然后當(dāng)玩家的操作數(shù)據(jù)包到達(dá)服務(wù)器之后,將其操作還原到歷史時(shí)間數(shù)據(jù)中,這樣可以解決不同玩家之間延遲不一樣帶來(lái)的誤差,保證玩家之間的操作是在公平的條件下。也正是因?yàn)橛羞@個(gè)機(jī)制,不同延遲的玩家因此得到平衡。