日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

王者荣耀服务端

發(fā)布時(shí)間:2023/12/14 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 王者荣耀服务端 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

分享要點(diǎn)

  • 服務(wù)器框架
  • 通信方式
  • 同步方案
  • 暴擊同步
  • 服務(wù)器框架

    基本的框架:

    框架描述:

    • PVP對(duì)戰(zhàn)不分服,信息分區(qū)。微信1區(qū)可與微信2區(qū)一起PVP,ios平臺(tái)可與Android平臺(tái)的玩家一起PVP。保留

    分區(qū)的感念,英雄、信息、排位榜、站隊(duì)等是基于區(qū)的概念。

    • 房間對(duì)戰(zhàn)系統(tǒng),在線廣播單元不確定性、廣播數(shù)量很少,需要匹配一臺(tái)房間服務(wù)器讓10個(gè)玩家進(jìn)入一個(gè)服務(wù)器。
    • 一般的邏輯就是玩家登陸“大廳服務(wù)器”,然后選擇組隊(duì)或匹配游戲的功能,服務(wù)器會(huì)通知參與的所有游戲客戶端創(chuàng)建一條新的連接到房間服務(wù)上,這樣就能在一個(gè)匹配房間服務(wù)器里進(jìn)行游戲交互。

    通信方式

    通信方式一般有http和socket兩種方式,http每次通信完成后斷開連接,無法滿足頻繁交互的應(yīng)用,所以游戲一般采用socket方式來通信。

    socket通信:TCP、UDP

    TCP與UDP的優(yōu)劣:

    基于游戲的功能與場景不同,采用不同的socket通信,王者榮耀是UDP的。

    同步方案

    王者榮耀使用的是:Lockstep 幀同s

    • Lockstep基本原理

    幀同步可以說是通過幀率延申過來的,一個(gè)游戲看作一個(gè)巨大的狀態(tài)機(jī),所有游戲玩家都采用同一個(gè)邏輯幀率來不斷向前推進(jìn)。

    如下兩圖:

    ?

    ?

    圖中是A、B、C三個(gè)玩家的時(shí)間軸,這個(gè)時(shí)間軸不是電腦上的本地時(shí)間,而是A、B、C聯(lián)機(jī)時(shí)定義的一個(gè)時(shí)間軸。虛線分隔出來時(shí)間片稱為turn,可以理解成一幀。箭頭表示該玩家將自己的操作指令廣播給其他玩家。

    我們把一盤游戲看成一個(gè)大型的狀態(tài)機(jī),因?yàn)榇蠹彝娴氖峭豢畹挠螒?#xff0c;因此F是相同的,初始狀態(tài)S0也是相同的。在第一個(gè)turn結(jié)束時(shí),所有玩家都接收到了完全一樣的輸入I,注意這里的I不是一個(gè)值,而是包含了當(dāng)前游戲中所有玩家的操作指令集合。t1時(shí)刻所有玩家的電腦自行計(jì)算結(jié)果。由于F、S0和I是固定的,所以每個(gè)玩家電腦上計(jì)算出的下一個(gè)狀態(tài)S1一定是相同的。

    舉個(gè)例子,假設(shè)A、B、C是游戲中3個(gè)互相敵對(duì)的單位,攻擊力都為100。在某一個(gè)turn內(nèi),A和B都右鍵點(diǎn)擊了C(warcraft這類游戲好像都是右鍵普攻),C右鍵點(diǎn)擊了A,這些操作指令都廣播到了其他玩家電腦上,則該turn的輸入為“A攻擊C、B攻擊C、C攻擊A”。那么該turn結(jié)束后,每個(gè)人的電腦都開始計(jì)算,且計(jì)算結(jié)果是相同的,即“A損失100生命值,B不變,C損失200生命值”。

    通過上面可以知道:

  • 游戲的前進(jìn)分為一幀幀,與游戲的渲染幀率不一樣,只是借鑒幀的原理,自定義的幀turn,游戲的同步實(shí)現(xiàn)是每一個(gè)turn不斷向前推進(jìn)的結(jié)果,每個(gè)游戲玩家的turn推進(jìn)速度一致。
  • 每一幀只有當(dāng)服務(wù)器集齊了所有玩家的操作指令,也就是輸入確定了之后,才可以進(jìn)行計(jì)算,進(jìn)入下一個(gè)turn,否則就要等待最慢的玩家。之后再廣播給所有的玩家。如此才能保證幀一致。
  • Lockstep的游戲是嚴(yán)格按照turn向前推進(jìn)的,如果有人延遲比較高,其他玩家必須等待該玩家跟上之后再繼續(xù)計(jì)算,不存在某個(gè)玩家領(lǐng)先或落后其他玩家若干個(gè)turn的情況。使用Lockstep同步機(jī)制的游戲中,每個(gè)玩家的延遲都等于延遲最高的那個(gè)人。
  • 由于大家的turn一致,以及輸入固定,所以每一步所有客戶端的計(jì)算結(jié)果都一致的。
  • ?

    • Lockstep執(zhí)行流程

    ?上圖中我們可以明顯看到,這種囚徒模式的幀同步,在第二幀的時(shí)候,因?yàn)橥婕?有延遲,而導(dǎo)致第二幀的同步時(shí)間發(fā)生延遲,從而導(dǎo)致所有玩家都在等待,出現(xiàn)卡頓現(xiàn)象。

    樂觀鎖&斷線重連:

    囚徒模式的幀同步,有一個(gè)致命的缺陷就是,若聯(lián)網(wǎng)的玩家有一個(gè)網(wǎng)速慢了,勢(shì)必會(huì)影響其他玩家的體驗(yàn),因?yàn)榉?wù)器要等待所有輸入達(dá)到之后再同步到所有的c端。

    另外如果中途有人掉線了,游戲就會(huì)無法繼續(xù)或者掉線玩家無法重連,因?yàn)樵趪?yán)格的幀同步的情況下,中途加入游戲是從技術(shù)上來講是非常困難的。因?yàn)槟阒匦逻M(jìn)來之后,你的初始狀態(tài)和大家不一致,而且你的狀態(tài)信息都是丟失狀態(tài)的,比如,你的等級(jí),隨機(jī)種子,角色的屬性信息等。

    比如玩過早期的冰封王座都知道,一旦掉線基本這局就廢了,需要重開,至于為何沒有卡頓的現(xiàn)象,因?yàn)槟菚r(shí)都是解決方案都是采用局域網(wǎng)的方式,所以基本是沒有延遲問題的。

    后期為了解決這個(gè)問題,如今包括王者榮耀,服務(wù)器會(huì)保存玩家當(dāng)場游戲的游戲指令以及狀態(tài)信息,在玩家斷線重連的時(shí)候,能夠恢復(fù)到斷線前的狀態(tài)。

    不過這個(gè)還是無法解決幀同步的問題,因?yàn)閲?yán)格的幀同步,是要等到所有玩家都輸入之后,再去通知廣播client更新,如果A服務(wù)器一直沒有輸入同步過來,大家是要等著的,那么如何解決這個(gè)問題?

    采用“定時(shí)不等待”的樂觀方式在每次Interval時(shí)鐘發(fā)生時(shí)固定將操作廣播給所有用戶,不依賴具體每個(gè)玩家是否有操作更新。如此幀率的時(shí)鐘在由服務(wù)器控制,當(dāng)客戶端有操作的時(shí)候及時(shí)的發(fā)送服務(wù)器,然后服務(wù)端每秒鐘20-50次向所有客戶端發(fā)送更新消息。如下圖:

    ?上圖中,我們看到服務(wù)器不會(huì)再等到搜集完所有用戶輸入再進(jìn)行下一幀,而是按照固定頻率來同步玩家的輸入信息到每一個(gè)c端,如果有玩家網(wǎng)絡(luò)延遲,服務(wù)器的幀步進(jìn)是不會(huì)等待的,比如上圖中,在第二幀的時(shí)候,玩家A的網(wǎng)速慢,那么他這個(gè)時(shí)候,會(huì)被網(wǎng)速快的玩家給秒了(其他游戲也差不多)。但是網(wǎng)速慢的玩家不會(huì)卡到快的玩家,只會(huì)感覺自己操作延遲而已。

    暴擊同步

    我們都知道,王者榮耀中有許多問題是與概率相關(guān)的,比如整點(diǎn)時(shí)野怪是隨機(jī)刷新的,出了無盡之后是有概率暴擊的。那么按照Lockstep同步機(jī)制,計(jì)算都是在每個(gè)玩家自己手機(jī)上完成的,那么在有概率存在的情況下,怎么可能保證每臺(tái)手機(jī)的計(jì)算結(jié)果一致呢?!

    這時(shí)使用到偽隨機(jī)數(shù),我們來看下面這個(gè)Java程序

    大部分編程語言內(nèi)置庫里的隨機(jī)數(shù)都是利用線性同余發(fā)生器產(chǎn)生的,如果不指定隨機(jī)種子(Random Seed),默認(rèn)以當(dāng)前系統(tǒng)時(shí)間戳作為隨機(jī)種子。一旦指定了隨機(jī)種子,那么產(chǎn)生的隨機(jī)數(shù)序列就是確定的。就是說兩臺(tái)電腦采用相同的隨機(jī)種子,第N次隨機(jī)的結(jié)果是一致的。

    所以在游戲開始前,服務(wù)器為每個(gè)玩家分配一個(gè)隨機(jī)種子,然后同步給client,如此每個(gè)client在計(jì)算每個(gè)角色的技能時(shí)候,就能保證傷害是一致的。這也是多數(shù)幀同步游戲采用的方案,王者榮耀實(shí)現(xiàn)就如此。

    例如一個(gè)英雄的暴擊率為30%,對(duì)某個(gè)目標(biāo)持續(xù)普攻,如果隨機(jī)數(shù)序列為12 32 90 25,小于等于30判定暴擊,大于30判定不暴擊,那么每個(gè)玩家電腦的計(jì)算結(jié)果都是暴擊 不暴擊 不暴擊 暴擊。(這里只是舉例說明原理,游戲中的實(shí)現(xiàn)細(xì)節(jié)不一定是這樣)

    ?

    注:此文是筆記,寫博客方便自己查閱,若不喜,勿噴!

    ?

    ?

    ?

    總結(jié)

    以上是生活随笔為你收集整理的王者荣耀服务端的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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