當前位置:陽光遊戲站 >

單機圖文攻略

> interp參數中文最詳解釋,[反恐精英]ex

interp參數中文最詳解釋,[反恐精英]ex

  編者按:很久以來,有關ex_interp的爭論就不斷,目前國人的對其的認識,我想大多數都是這麼認為的:Valve已經修正了有關ex_interp的BUG,ex_interp 0.1 和0.01都是合法的,並不會造成不公平現象,而且相比之下ex_interp = 0.01更佔便宜。所有這些認識,我想應該都是源於OGC在《向CPL新加坡致敬》中引用的關於ex_interp的解釋,那篇解釋之前已經被包括我在內的無數人看過,也在心中植下了根深蒂固的印象,OGC還在尋找原作者署名吧?不要找了,原作者是個外國人,如果真有人來了那一定是假冒的……

[反恐精英]ex interp參數中文最詳解釋

其實,在那篇文章裏,對於ex_interp的解釋是基本正確的,呵呵。

最後,作者額外的解釋了兩句:

另外一點,如果你想你的cs更象“街頭混戰”一樣的話,用另外的話説平滑而無頓挫感,那麼我建議你將ex_interp設定為0.1。

不過如果你想你增加你的準確度的話(子彈打在你所實際瞄準的位置),那麼就把ex_interp設定到最低值。

這麼一句話,讓每個人都以為ex_interp 為0.01佔到了便宜。沒錯,應該是這樣,服務器通過插值運算出來的人物運動只是模擬而已,也就是説,如果你的槍剛好在模擬運算欺騙了你的眼睛的同時開火的話,子彈是註定打不到你想打的人的。

不過請看Gotfrag上John Mellin寫的文章《Cs 1.6 NetCode Explained》(付費內容)

ex_interp:Set this variable to 0 and nothing else. Counter-Strike will automatically set your ex_interp to 1/cl_updaterate (i.e. your console will say: ex_interp forced up to xx msec?. This is because the time in between each packet is exactly 1/(the # of updates per second), so this is how long you want your client to interpolate. Adjusting your cl_updaterate will automatically adjust your ex_interp (when ex_interp is set to 0). I recommend only changing your cl_updaterate, and letting Counter-Strike set your ex_interp. You cannot set this command lower than 1/cl_updaterate anymore, and setting it higher is an exploit. Using a valve above 1/cl_updaterate forces you to shoot behind the actual model displayed on your screen, which should be considered an exploit. For example, if you use cl_updaterate 101, the correct valve for ex_interp would be 1/101 = 0.009 (9 milliseconds), but by using the default valve of ex_interp 0.1 with this high cl_updaterate, the aforementioned exploit appears.

Recommendation:

ex_interp 0.

這麼一段話的意思是:

ex_interp:

把這個值設成0,CS會自動把你的“ex_interp”設成“1/cl_updaterate”(控制枱會告訴你“ex_interp”被強制設成XX毫秒。原文“ex_interp forced up to xx msec”)。這是因為兩個數據包之間的時間間隔就正好是1/(每秒更新次數),這就是你需要客户端做出插值預算的時間長度。調整“cl_updaterate”會自動調整“ex_interp”(當“ex_interp”設成0的時候)。我建議你只修改“cl_updaterate”,而讓你的CS來自動修改“ex_interp”。你現在不能把“ex_interp”設置的低於“1/cl_updaterate”,而把它設高則導致了你射擊對手的時候不得不瞄準出現在屏幕上的人的後面,這種行為通常被認為是exploit。比如,如果你的“cl_updaterate”是101,你“ex_interp”的正確值就是“1/101=0.009”(9毫秒)。而使用默認值0.1就形成了前面所説的exploit。注意到這裏有段:而把它設高則導致了你射擊對手的時候不得不瞄準出現在你屏幕上的人的後面。

這段話看起來是不是很彆扭?字面上看還是設高了吃虧嘛,呵呵,彆着急,這是這個外國人沒解釋好,一會我會給出中國人能看懂的解釋。現在肯定有人想問,什麼是exploit?我是搞計算機的,一般在網絡攻擊中,exploit是代表“溢出”,“漏洞”的意思。

再看cpl的相關規則:Any competitor or team accidentally utilizing ANY exploit or bug in a map or game will forfeit that round and all remaining rounds for the half. Players need to be responsible for their actions in regards to know map or game bugs/exploits.

大概意思是:

任何人利用任何BUG或exploit在一副地圖或者一場比賽中將被判當局以及該半場內之後所有之局為負,選手們有責任瞭解在地圖和遊戲中什麼樣的行為可能導致BUG和exploit的產生。

所以,如果我們把BUG翻譯為錯誤的話,那麼可以把exploit看做是漏洞。但是,在這篇文章裏,還是沒有詳細的解釋清楚,為什麼ex_interp 設置高了會是一個exploit?而Using a valve above 1/cl_updaterate forces you to shoot behind the actual model displayed on your screen這句話真是隻有鬼才看的明白。要怪就怪Valve,從來沒有官方聲明能把這些參數完全解釋清楚,是否那些做程序的人自己都不玩CS呢?這雖然可能有人知道,但至少你不知道,我不知道,我們中國人也都不知道。即便是在國外,大多數的人的相關認識也是通過以上2篇文章以及由這2篇文章衍生出的其他一些文章建立起來的。但是所有的文章,都沒有給出一個可以讓人看懂的解釋,看完所有這些文章以後,我們的疑問反而越來越多,究竟ex_interp的修改對遊戲的效果有沒有影響,為什麼有人會説,ex_interp 高是"Indeed Cheating"?

那麼現在我來對ex_interp做個更詳細的解釋,似乎好像應該彷彿國內外還沒有我這麼對ex_interp解釋完全的文章,希望看了這篇文章之後,你對ex_interp的認識會超過70%以上的老外,也許他們明白怎樣修改ex_interp會導致犯規,但是也未必清楚真正導致犯規的原因。

其實所有的分析都基於以下幾個已經確定的內容(請注意,這裏只討論1.6,1.5由於存在bug,無法用以下説法解釋)。

已知:

1. ex_interp設置為0即為一個開關,作用是ex_interp開始根據你的cl_updaterate數值進行全自動調校,我們可以認為,此時的ex_interp實際值即為valve的推薦值,也是理論上最適合的值。

_updaterate 的概念為每秒從服務器接受的數據包數量。這個數值能否正常發揮其作用,取決於2個方面,一個是服務器的FPS是否大於你的cl_updaterate數值,一個是服務器端是否設置了sv_maxupdaterate 大於或等於你的cl_updaterate數值。

_interp的實際數值決定了插值運算的強度,ex_interp越小,在你看到一個人的完整運動軌跡之中,由插值運算所產生的比例越小。

_interp的數值(0.1,0.01等)實際上可加上一個單位s,其實0.1就代表0.1秒。

我們來對比一下兩種情況下cl_updaterate和ex_interp的關係。

當cl_updaterate 為100時 ,ex_Interp最佳值為0.01 即0.01s=10ms

當cl_updaterate 為10時, ex_interp最佳值為0.1即0.1s=100ms

我們可以注意到,第一種情況,100X10=1000ms,第二種情況10X100=1000ms。

而1000ms=1秒。你可以試一下別的數值,最後的乘積一定也是1000ms。

注意到cl_updaterate為每秒從服務器接受的數據包數量。

所以我們可以這麼解釋,當客户端每接收到一個數據包之後,可以確定一次你的對手的真實位置。自你接收到第一個數據包開始xxms之內,你看到的對手運動軌跡為插值計算所得,這個xx=ex_interp的數值。舉例説明,當clupdaterate 為100時,每隔1/100=10ms你接收到一個數據包,所以ex_interp 設置為10ms為最合適的數值;因為剛好10ms之後你又能收到第二個數據包,從而完美的實現銜接過程。同理cl_updaterate為10時,ex_interp=0.1就是最佳的數值。

現在我們來用目前爭議最大的wNv和Fnatic的戰鬥過程來舉例:

Fnatic 的設置:

cl_updaterate=100,ex_interp=0.01=10ms

wNv(或者説wNv-Kin'z)的設置:

cl_updaterate =100,ex_interp=0.1=100ms

兩者都是每秒接收到100個數據包,但由於wNv的ex_interp設置為100ms,所以當kin'z接收到第一個數據包後,客户端根據插值運算虛擬計算出了100ms內對手的可能行為。

而此時Fnatic隊員的cs客户端只虛擬計算出了10ms內對手的可能行為。

現在有人會想當然的認為,這樣wNv隊員不是"提前"90ms預知對手的行為了?實際上這也是John Mellin和被其影響的相當多數外國人的想法。然而我要説這種想法是錯誤和主觀的。首先,客户端雖然“預知”了對手未來的行為,但是操作客户端的玩家卻無從知曉,客户端要想反應出敵人未來100ms的情況,同樣需要花100ms的時間。其次,上面所説的情況其實根本不會產生。

我們注意到此時雙方的cl_updaterate 都為100。這意味着,在接收到第一個數據包之後10ms,客户端將接受到第二個數據包。對fantic這一方而言,第二個數據包處於剛好銜接上的狀態。對wNv這一方而言,雖然在第一個數據包到達之後,客户端虛擬出了未來100ms內對手的行為。但是10ms後,第二個真實反映對手位置的數據包到達了。

我們可以想象出此時程序的2種處理方式,如下:

第一,忽略多出的90ms虛擬計算數據,採用到達的真實數據。

第二,忽略第二個數據包的內容,繼續採用虛擬的計算數據,直到第10個數據包到來。

第二種情況是不科學的,也不可能是valve實際採用的,因為如果按第二種情況處理的話,其實cl_updaterate 10和cl_updaterate 100在ex_interp為0.1的情況下沒有任何區別。你可以去一個服務器裏把cl_updaterate 改成10 ,試下你的感覺……

那麼我們可以認為程序是按第一種模式運行的。

於是我可以提出我的結論:

在cs1.6中,當cl_updaterate數值足夠且網絡狀況良好的情況下,ex_interp為0.1或ex_interp為“1/cl_updaterate數值”這2種設置並沒有實際區別。採用其中任何一種設置均獲得近似相等的效果,並不存在所謂的不公平性因素。

那有人要問,為什麼valve把最佳值設為"1/cl_updaterate數值"而不統一設定為0.1?

我想,那是一個最優數值,使用這個數值,可以避免cpu時間被無謂的浪費要知道cpu計算數據量的不同耗費的時間也不同,在這裏也存在一個"延遲",而且可能還會略微的影響FPS。所以我在結論中用了一個"近似相等"。至於影響的大小是可以完全忽略不計還是可以微微感覺的到,這就不在本文研究的範圍之內了。在平時進網絡服務器打比賽或混戰的時候,使用ex_interp 0.01等參數可能會導致人物一跳一跳,這是由於互連網絡連接狀況不穩定, 如果產生了lost(丟包),choke(阻塞),那麼使用ex_interp 0.01等參數就有可能出現插值運算結束後不能銜接上下一個數據包,這樣反映出來的效果就是人物會跳動。

最終我依然推薦平時將你的ex_interp設置為0,而cl_updaterate設置為60-100,比賽時設置為ex_Interp 0.01,cl_updaterate設置為100。

另外,有人抱怨在國內的大多數服務器中無法修改ex_interp,這裏呼喚一下所有粗心的服務器架設者們,請到服務器安裝目錄下的cstrikeaddonswwcl子目錄下修改下wwcl的配置文件。具體過程:首先查看確定你現在用的wwcl模式。注意前面沒有//註釋的就是目前你採用的wwcl模式,然後修改該模式對應的config文件,以ex_interp做關鍵字查找到鎖定ex_interp的那一行將其刪除,並把brightness參數由原先鎖定的1修改為3。

而對於玩家而言,也不必過於擔心此事,如果你能習慣ex_interp=0.1,那麼你就能習慣ex_interp=0.01 。

關於ex_interp,我想以上已經解釋的足夠清楚了。

  • 文章版權屬於文章作者所有,轉載請註明 https://ygyxz.com/twdj/4ey17.html