關於遊戲掉幀(轉載至b站愛好逍遙)|T3


3樓貓 發佈時間:2022-08-21 04:31:32 作者:量子波動可樂 Language

延遲狗真噁心,我打他全是假紅”

“蘋果狗真噁心,我打他全是假紅”

“蘋果拉出來能先看到安卓的,安卓的還沒看到蘋果的就掉血了”

“高延遲橫拉能先看到低延遲,低延遲還沒看到高延遲就掉血了”


“md又是延遲狙我都退回牆後還是死了”

《真理》—— 蘋果服和高延遲槍戰中佔據優勢

......

然而事實果真如此嗎?

與單機遊戲例如求生之路和反恐精英在本地架設服務器進行聯機遊戲的“客戶端-客戶端”架構不同,網絡遊戲是以“客戶端-服務器”為架構將全國各地的玩家們聯繫起來的。玩過求生之路的朋友應該知道,聯機對戰時如果房主的網絡卡了,那麼房間內其他玩家都會變卡。但網絡遊戲的主機為官方遊戲服務器,因此某個網絡不穩定的玩家並不會影響到其他玩家的網絡連接狀態。在網絡遊戲中,玩家本地客戶端將移動開火等數據處理後發送到官方服務器,經服務器計算後再將計算結果例如傷害判定反饋給客戶端的玩家。圖1和圖2展示了不同網絡延遲下客戶端與服務器之間的連接關係。

圖1:不同網絡延遲下玩家與服務器之間的響應延遲滯後情況
圖2:不同網絡延遲下客戶端與服務器交互所需時長(類比距離遠近)
開火到服務器判定造成傷害是需要時間的,FPS槍戰遊戲從開槍到擊中敵人的過程為,玩家射擊敵人-數據上傳-服務器計算傷害-數據下載-玩家得知結果,網絡延遲越高時,數據上傳和數據下載所需的時間將更長。由BV1ef4y1y7J3在3:57的高低延遲對狙測試可知,110ms和50ms同時開槍對狙,50ms只需要0.05秒就能告訴服務器我開了槍,而110ms則需要0.11秒才能告訴服務器我開了槍,因此對狙時同時開槍,即便高Ping視角中已經完成了開槍動作,但依然會被低Ping所擊殺,並且死亡時間在開槍的0.11秒後。一個很簡單的例子,由BV1ef4y1y7J3在1:50對槍測試可知,假設擊殺敵人只需要4發子彈,30ms需要連射5發就能夠擊殺敵人,而110ms則需要連射6發才能夠擊殺敵人。並不是槍的傷害變低了,而是110ms打出第1發子彈的數據還在向服務器傳輸的路上,當打出第6發子彈時前4發子彈的數據才傳輸到服務器產生傷害並擊殺敵人,最後2發子彈實際打在了空氣中,而30ms只有1發子彈打在了空氣中。那如果110ms和30ms都只打4發子彈呢?是一樣可以擊殺敵人的,但都無法立即獲得擊殺反饋,110ms需要等待第4發子彈打出後經過0.22秒才能得知自己擊殺了敵人,而30ms只需要等待0.06秒就能得知擊殺敵人這個信息,因此低延遲玩家可以搶在高延遲玩家之前進行傷害判定,更早完成擊殺獲得反饋並停止射擊。

那麼移動開火呢?由BV1ef4y1y7J3的2:00提前槍測試可知,首先由110ms靜止架點,30ms橫拉開火。測試中30ms看到了110ms的全身,而110ms連30ms人都沒看到就開始掉血。30ms開火後經0.03秒的數據上傳便可造成傷害,然後再經0.03秒的數據下載便可看到傷害數字,30ms所經歷的閉環時間為0.06秒非常短,因此在30ms視角中從開槍到顯示傷害幾乎是同時的。反觀30ms靜止架點,110ms橫拉開火。110ms開槍後經0.11秒的數據上傳後才可造成傷害,然後再經0.11秒的數據下載才可看到傷害數字,110ms所經歷的閉環時間為0.22秒更為長,因此110ms橫拉開火看到30ms全身並且都退回牆後了才顯示傷害。那麼為什麼實驗中30ms受傷時至少還能看到110ms漏了一條腿,而110ms連30ms的人都沒看到就開始掉血呢?這是因為實驗中110ms的網絡延遲比30ms高,110ms需要0.11秒才能完成數據接收看到對手,而30ms僅需要0.03秒數據接收即可看到對手,30ms的0.03秒比110ms的0.11秒快了0.08秒。如果110ms看到30ms出現就立刻作出反擊呢?當110ms看到30ms出現時,已距30ms有效攻擊110ms已長達0.11秒,110ms開火反擊後還需要0.11秒的數據上傳才能對30ms造成傷害,也就是說110ms被打了0.22秒後才能做出有效反擊,這段時間內30ms早已在服務器裡對110ms造成了大量傷害甚至做到了擊殺,因此Ping越低才能越早看到敵人出現並做出有效反擊。但在進攻和架點的情況下,無論高延遲還是低延遲,架點方都是等待接收敵人出現數據的被動方,進攻方都是傳輸開火造成傷害數據的主動方,因此主動進攻可以彌補高延遲所帶來的不利影響。具體測試可見BV1SJ411A7QV。

即使30ms的網絡延遲並不高,但也必須經過0.03秒的數據接收後才能看到敵人的出現,導致雙方掉血時好像都沒看到敵人出現一樣,這是因為你的網絡延遲Ping值並不為0ms,只要Ping值不為0ms,即使是1ms的網絡延遲也需要經過0.001秒才能看到敵人出現。網絡延遲Ping越低,就能越早與服務器完成數據交互,被進攻時才能更早看到對手在服務器中位置的改變,避免沒看到人就掉血的情況。值得一提的是,無論30ms還是110ms,在他們數據上傳的0.03秒和0.08秒裡,動作都還未告知服務器,因此不僅不會出現在敵人的視野裡,也無法對敵人造成傷害。流言中“你高延遲人家都看不到你就開始掉血了”便不攻自破,高Ping玩家橫拉的確能先看到靜止的對手,但這並不是對手的實時位置,對手在移動看到的則是他0.1秒之前的位置,高Ping玩家永遠活在滯後的世界中。高Ping玩家移動開火,會與其他玩家一樣,只有當服務器接收到來自客戶端發送的動作數據後,才會出現在低Ping玩家視野里拉槍開火和造成傷害。如果高Ping能做到讓對手看不到自己能把他擊殺的話,那幾百上千的Ping豈不是能做到幽靈殺人,斷網重連在家就能直接滅隊?移動也好開槍也好,這些動作傳輸到服務器併產生效果是需要時間的,這段傳輸時間就是通常所說的網絡延遲。但這麼說並不嚴謹,因為Ping本身並不是網絡延遲,而是一種表達本地與服務器之間數據包交互速率的方式,延遲是傳輸速率低導致了滯後效應所產生的現象。


斷網後無論走多遠,一旦網絡恢復就會被拉回原位,無論開多少槍都無法造成傷害(可見BV1ef4y1y7J3中2:52斷網測試),這是因為斷網時任何動作的數據都無法傳輸到服務器,你看其他玩家都沒動,但在其他玩家視角里其實只有你沒動。有時走3步突然被瞬移拉回2步,這並不是你的網絡延遲高了,而是因為你的網絡丟包了,你看其他玩家在滑步,但在其他玩家視角里只有你在反覆前後閃現。假紅和瞬移早已是CF手遊玩家老生常談的問題,原因有兩個,首先最大的問題是服務器Tickrate過低,導致服務器判定次數太少引起的假紅(圖3展示了不同Tickrate下Hitbox的刷新頻率)。FPS遊戲中受擊實體Hitbox和人物模型並不完全匹配,對於快速移動的物體,即使是幾毫秒的微小差異也會存在巨大的誤差,Tickrate簡單來說是玩家Hitbox在服務器裡的刷新頻率,頻率越高Hitbox在服務器中每秒刷新的次數就越多,子彈判定就越準確,人物模型在服務器中的移動就會越細膩。頻率越低就越容易出現打中敵人卻無法造成傷害,越容易看到敵人和隊友瞬移的現象,特別是鬼跳時有發生的後撤步和瞬移,大家應該都不陌生。假紅並不是你延遲高,也不是對方延遲高,而是在服務器中你的子彈打在了Tick空隙沒有擊中Hitbox,因此沒有造成傷害。瞬移則因為服務器中Hitbox刷新次數過低,突然的變向運動讓一段連續的Hitbox在一個Tick中產生了巨大的空隙,兩個相鄰且相距甚遠的Hitbox導致了人物模型在運動過程中的瞬移,只有提高服務器刷新率Tickrate才能填補Hitbox在移動中的空隙。當然還有一種明明沒打中敵人卻造成了傷害的情況,這也是因為Tickrate太低,Hitbox無法緊跟人物模型,導致打在運動軌跡身後的空氣上依然能夠造成傷害。其次是不同玩家之間存在網絡延遲差,網絡延遲會影響客戶端上傳到服務器的數據,影響服務器Tickrate的檢測率。網絡的不穩定性會導致客戶端與服務器出現判定不同的問題,即客戶端判定玩家擊中了A擊中玩家B,但服務器判定玩家A並沒有擊中玩家B,特別在刀戰這種頻繁移動和跳躍的模式中,假紅和閃現的現象更為明顯。這需要官方優化服務器的發包方案,通過減少丟包率來減少假紅。

圖3:不同Tickrate下Hitbox的刷新頻率
FPS槍戰遊戲中還有一種情況經常出現,我方視角明明已經躲回了牆後,但在敵方視角中我方身體並未完全躲回牆後,敵方還可以繼續造成傷害,導致在我方看來是死在牆後的反常現象,但在敵方看來是死在牆外的正常現象,這與Tickrate和Ping值都有關係。由於Ping值差,我方視角雖然已經移動回到牆後,但這個動作傳輸到服務器需要時間,服務器再傳輸到敵人視野裡也需要時間,在這段時間內雖然我方視角已經開始移動,但在敵方視角中我方依然保持未動。只有當服務器接收到移動這個動作的數據後,你的位置在服務器中才會發生改變,當對手接收到來自服務器你的位置發生改變的數據後,在敵人視野裡你的位置才會發生改變。並且這個過程還會受到Tickrate的影響,即使敵方子彈描邊打在了運動軌跡後的空氣上擊中了Hitbox也會造成傷害。

補充一點,什麼是延遲補償機制?“為什麼明明我都走到了B門還被中門的潛伏者狙了,在他的視角里我才剛走到中門?”。延遲補償是為了避免不同Ping值的玩家在對戰時引發的邏輯問題。假設玩家A在開火時命中了玩家B,玩家A的數據上傳至服務器的途中玩家B走開了,當數據到達服務器時正好玩家C路過,導致擊殺的是玩家C而不是玩家B。為了避免這種現象,延遲補償會讓玩家A最後擊中是玩家B而不是玩家C,即使玩家B回到牆後還是會被擊殺,這也是所謂的子彈拐彎。雖然玩家B死在了牆後會很生氣,但前提必須是玩家A開火命中了玩家B,如果沒有命中依然是無法造成傷害的,這不能怪玩家A的延遲太高,而是玩家B在1秒前漏的身位太大了,簡單來說高Ping玩家是在跟1秒前的低Ping玩家戰鬥。(“Lag Compensation for First-Person Shooyer Games in Cloud Gaming” <Autonomous Control for a Reliable Internet of Service>)。雖然存在延遲補償,但並不會影響誰先看到誰,就正如上文所說,牆後橫拉方一定能先看到靜止架點方,靜止架點方如果想更早看到敵人的出現,就必須通過降低自己的網絡延遲,來提高接收服務器發送給你的‘’敵人從牆後出來了‘’信息的接收速率。

Tickrate是官方遊戲服務器的屬性,玩家無法提高或優化。但網絡延遲越低的玩家傷害判定就越快,看到敵人出現所需的時間就越短。低延遲玩家無論做什麼,接收和傳遞數據都會快人一步。因此FPS槍戰模式下低延遲是優勢方,高延遲是劣勢方,但主動進攻可以彌補延遲差所帶來的不利影響
(侵權刪)

© 2022 3樓貓 下載APP 站點地圖 廣告合作:asmrly666@gmail.com