• <sub id="h4knl"><ol id="h4knl"></ol></sub>
    <sup id="h4knl"></sup>
      <sub id="h4knl"></sub>

      <sub id="h4knl"><ol id="h4knl"><em id="h4knl"></em></ol></sub><s id="h4knl"></s>
      1. <strong id="h4knl"></strong>

      2. 揭秘RTS游戲中的同步機制

        時間:2024-08-25 07:04:04 游戲動漫 我要投稿
        • 相關推薦

        揭秘RTS游戲中的同步機制

          RTS游戲有很多,可能大家比較熟悉的有Warcraft III和 StarCraft,帶給我們無限的歡樂和回憶。還有當下比較流行lol與dota2,實際上都是孫子輩的游戲了。RTS游戲同步很重要,而且同步也能非常穩定地實現。那么他們到底是怎么做到高頻操作又同步的呢?下面由yjbys小編來為大家解惑。想了解更多相關資訊請持續關注我們應屆畢業生培訓網。

          同步機制

          假設游戲中A,B兩個玩家移動,并同時向對方發出射擊指令,如果沒有合適的同步機制,那么可能出現的情況有:

          · A屏幕顯示B已經被殺死,B屏幕顯示A已經被殺死

          · 或者在瞄準后確打不到對方

          因為網絡是有延時的,而每個玩家的網絡情況都不盡相同。還有每幀渲染的.延遲(早期的計算機性能不夠好的時候 會出現這個問題)

          同步機制最重要的作用就是解決延遲等可能發生不一致的情況。

          同步機制的分類

          Peer-to-peer模式

          沒有服務器,每個玩家互相連接,各自模擬整個流程.典型的lockstep模式

          優點:減少主機帶來的延時

          缺點:容易作弊

          Client-Server模式

          所有的操作需經過服務器確認后才能進行客戶端模擬,如arpg傳奇類都是此架構,如果延時高就會有明顯的卡頓。

          優點:服務器是絕對的權威,可以防止作弊,可以做更多的.管理與限制

          缺點:服務器變的更復雜,服務器斷線,所有玩家斷線,屬于服務器依賴型。

          早期的RTS游戲大多采用Lockstep方案來設計,像羅馬帝國,沙丘之類。

          就是說玩家的數據每個時間段同步一次,同步的走。

          標準的lockstep模式

          · 每個玩家互相連接,整個游戲過程劃分成一組turn指令幀,由玩家自我模擬

          · 游戲速度取決于網絡最慢的那個玩家

          · 一個玩家掉線不會影響到其他玩家

          什么是Turn?

          一個turn可以理解成1個回合,相信大家都玩過回合制游戲吧,只是這個turn非常短,大概100MS-200MS。玩家相互之間發送的指令在每個turn間隔發出。

          每個玩家只需要接收指令,并在本地播放指令就可以啦。

          War3如何運算傷害?

          玩家到底是發送什么指令到主機,主機到底參與了什么計算呢?

          實際上玩家都只需要發送基本的指令如選擇單位,移動單位,使用技能1234,點擊物品欄1-6,可以通過APM查看 軟件看到一些基本操作事件。

          也就是說所有的一切傷害計算都是在本地計算完成的。

          包括傷害,暴擊,命中,刷怪等,只要初始化好隨機數種子就可以啦。

          玩家只是發送操作指令,如點擊坐標(0,1, 0),左鍵框選(100,100,50,50)等。

          每個玩家都在模擬全部的流程。

          那么War3到底算不算使用lockstep模式,或者是特殊的client-server?

          其實可以通過幾個問題判斷出:

          · 非主機玩家卡是否可以影響到其他玩家,如果不會,那么更可能是client-server模式

          · 可以通過抓包工具攔截網絡數據包的流向,來判斷是否是peer to peer的連接方式還是只連接到主機(或通過主機強制掉線方式判斷)。

          個人也認為War3是基于Client-Server的一種的特殊模式,主機肯定需要驗證一些邏輯。

          主機負責廣播每個client的指令,

          這存在兩個問題:

          · 本機(非主機)發出的指令,如果超時或者丟包,是否直接丟棄?

          · 其他玩家的指令,主機轉發未成功確認,如何處理?

          第一個問題

          1.如果是本機(非主機)發出的指令超時,可以直接丟棄。(如果不丟棄,其他玩家就必須等待結果,這樣會導致掛起,而且會非常頻繁,這里還有udp協議容易丟包的原因,但是war3好像并沒有經常性的掛起)

          還有一種可能,客戶端得知之前的turn沒有發送成功,把當前這輪的`指令和上一輪的指令進行合并,然后一起發出,這樣本地客戶端就不會有任何的異樣了。

          例如玩家移動到A后再移動到B

          上個turn的指令是移動到A點,但是沒有發成功,下個turn的指令先移動到A,再移動到B,這樣在客戶端就不會有 丟失的感覺啦,還是可以正常的模擬而不會影響到其他玩家。

          2. 收其他玩家的指令超時,那么屬于我們自身網絡的問題,如果丟棄必將導致游戲進程不同步,所以服務器必須將他們的turn指令都緩存起來,

          或者緩存一部分turn指令集,在我網絡穩定的時候,把丟失的那一部分turn指令集發給我,而我只需要下載那個list加快gameupdate就好啦。

          關于外掛的問題

          相信玩過魔獸的人基本都用過,實際上像戰爭迷霧,顯示單位等只會保存一個狀態值在內存中,只要定位到內存地址,改一下變量值就好了,一般是服務器是不會檢測這個的。

          而攻擊力,道具數量等,由于大家都需要模擬,你本地修改了,會影響到其他人,程序就會發生蝴蝶效應。

          至于現在非常流行的 Dota2 和 英雄聯盟,會額外的加入更多服務器來驗證和計算一些外部數據,但內部原理是一致的,早期的游戲與現在的網游不可同日而語。

        【揭秘RTS游戲中的同步機制】相關文章:

        盤點游戲中的活動需求10-24

        在游戲中教孩子唱歌10-23

        揭秘德國留學優勢05-21

        侗族舞蹈的特點揭秘09-10

        攝影技巧大揭秘11-05

        留學美國的真相揭秘10-29

        Java線程同步的方法10-25

        在游戲中鍛煉寶寶的動手能力!09-05

        深入解讀游戲中的敘事手法05-18

        盤點游戲中趣味的死亡方式05-25

        国产高潮无套免费视频_久久九九兔免费精品6_99精品热6080YY久久_国产91久久久久久无码
      3. <sub id="h4knl"><ol id="h4knl"></ol></sub>
        <sup id="h4knl"></sup>
          <sub id="h4knl"></sub>

          <sub id="h4knl"><ol id="h4knl"><em id="h4knl"></em></ol></sub><s id="h4knl"></s>
          1. <strong id="h4knl"></strong>

          2. 久久网一区二区三区 | 亚洲日韩一级在线毛 | 亚洲青涩天堂六月天在线视频 | 亚洲一区二区欧美精品 | 日韩女同中文字幕永久在线 | 伊人久久综合狼伊人久久 |