• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            loop_in_codes

            低調做技術__歡迎移步我的獨立博客 codemaro.com 微博 kevinlynx

            網游中的玩家移動

            Kevin Lynx 6.22.2010

            MMORPG中,玩家的移動主要邏輯都放在客戶端進行,包括自動尋路和響應玩家的操作,服務
            器在這里擔當一個被動角色。但是服務器端的玩家數據卻是真正的被其他邏輯模塊參考的數
            據。

            在這樣一種C/S主從關系中,如何保證C/S兩者各自維護的玩家坐標數據的一致性?為了保證
            數據的一致性,我們需要進行數據的同步。而導致數據不同步(不相同),也就是C/S之間
            玩家的坐標不一樣,主要來源于兩大原因:C->S數據的網絡延遲、S->C數據的網絡延遲。考
            慮到這兩個重要的因素,首先需要盡量減少C/S之間數據的交互。

            在一般的邏輯模塊中,客戶端發送一個請求到服務器,服務器作了驗證后返回驗證結果,客
            戶端接收驗證結果繼續之前的邏輯。這對于MMO中諸如物品操作而言是足夠的,但無法應用
            于玩家移動。

            這里的做法是:客戶端每走一步,都發消息(網絡封包)給服務器,服務器做驗證;客戶端
            停止走動后,通知服務器,服務器返回自己保存的坐標,客戶端在這個時候才使用服務器端
            的數據同步一次本地坐標。其操作序列如下圖:

            -----------------------------------------------------------------
            Client                                            Server
            移動、本地坐標改變    ---->            驗證C/S之間的坐標是否差距過大,
                                                驗證失敗通知客戶端停止移動
            停止移動              ---->            驗證同上
            同步本地坐標為服務器坐標   <---
            -----------------------------------------------------------------

            此外,客戶端保存一個請求計數,每一次發送一個移動請求時,遞增該計數;服務器收到該
            請求后,驗證成功,返回一個消息,客戶端收到此回應消息后遞減該計數。當該計數超過某
            個配置數值后,客戶端將忽略玩家的移動操作。客戶端還可以將玩家的多個移動操作合并為
            一個,即,只在角色到達玩家最后一次點擊的坐標時,才發送停止移動消息給服務器。

            配合請求計數機制,當C->S的消息出現延遲太久時,此時也意味著請求計數過大,客戶端會
            強迫玩家等待;服務器終于收到消息后,逐個處理,直到處理完后,客戶端的請求計數恢復
            時,玩家才可繼續移動。同樣,當S->C的消息(只考慮停止移動的消息回應)出現延遲時,
            這個時候客戶端很可能在本地做了另一次移動操作,在終于接收到上一次移動操作的服務器
            端回應時,因為這個時候客戶端毫無條件地將本地數據同步為服務器端發過來的數據,那么
            ,出現這種情況后,客戶端角色就會出現拉回去的現象。這里的一次移動,可能是多個地圖
            格子的移動,一般為角色當前坐標到玩家點擊的目標坐標。

            posted on 2010-06-22 21:27 Kevin Lynx 閱讀(4749) 評論(8)  編輯 收藏 引用 所屬分類: game develop

            評論

            # re: 網游中的玩家移動 2010-06-22 21:34 小時候可靚了

            搶沙發!  回復  更多評論   

            # re: 網游中的玩家移動 2010-06-22 21:39 小時候可靚了

            客戶端每走一步,都發消息(網絡封包)給服務器,服務器做驗證;客戶端
            停止走動后,通知服務器,服務器返回自己保存的坐標,客戶端在這個時候才使用服務器端
            的數據同步一次本地坐標。

            這樣會不會導致本地角色看到其它玩家的移動不自然呢?  回復  更多評論   

            # re: 網游中的玩家移動 2010-06-22 22:34 evoup

            每一步,不至于吧,應該是a點到b點間一定時間內修正客戶端的位移吧,該時間內按照玩家點擊的位置客戶端自己位移才是吧,真的實時怎么吃得消。  回復  更多評論   

            # re: 網游中的玩家移動 2010-06-23 08:52 Kevin Lynx

            @evoup
            話說你沒有看清楚我說的內容。每一步發的消息僅用于服務器的驗證,不同步客戶端數據。
            @小時候可靚了
            這個屬于另一個話題了,客戶端會粗略估算其他角色的移動情況,如取得方向模擬其行走,以達到自然的效果,改天細談下。  回復  更多評論   

            # re: 網游中的玩家移動 2010-06-23 09:35 keror

            “考慮到這兩個重要的因素,首先需要盡量減少C/S之間數據的交互。“
            “服務器收到該請求后,驗證成功,返回一個消息”

            這個有減少數據交互么?  回復  更多評論   

            # re: 網游中的玩家移動 2010-06-23 09:39 Kevin Lynx

            @keror
            這里返回的消息,客戶端僅用于遞減請求計數。不會立即影響客戶端的移動效果。  回復  更多評論   

            # re: 網游中的玩家移動 2010-06-24 22:29 evoup

            呵呵有道理  回復  更多評論   

            # re: 網游中的玩家移動 2010-07-08 15:21

            這個是誰啊、、、我暈的。。。我是goole來的。。。  回復  更多評論   

            久久久久国产精品熟女影院| 久久亚洲欧美国产精品| 99久久99久久久精品齐齐| 精品久久久久国产免费| 久久精品国产亚洲AV忘忧草18| 伊人久久综合无码成人网| 99久久精品免费看国产一区二区三区| 久久人妻少妇嫩草AV蜜桃| 久久久久久午夜成人影院| 99国产精品久久久久久久成人热| 中文字幕久久欲求不满| 久久99久久99精品免视看动漫| 国产午夜精品久久久久免费视| 国产精品久久久久久久久久影院| 久久精品国产精品亚洲| 国产成人精品久久亚洲高清不卡 国产成人精品久久亚洲高清不卡 国产成人精品久久亚洲 | 88久久精品无码一区二区毛片| 久久久久久国产精品美女| 人妻无码αv中文字幕久久琪琪布 人妻无码久久一区二区三区免费 人妻无码中文久久久久专区 | 久久久精品免费国产四虎| 国产国产成人精品久久| 亚洲AⅤ优女AV综合久久久| 狠狠色丁香婷婷综合久久来来去 | 99久久国产综合精品成人影院| 久久久久久国产a免费观看黄色大片| 国内精品久久久久久久涩爱 | 午夜精品久久久久久久久| 欧美激情一区二区久久久| 国产精品美女久久久久av爽| 精品熟女少妇a∨免费久久| 99久久精品免费看国产一区二区三区| 久久久久噜噜噜亚洲熟女综合| 国产一区二区三区久久| 99国产精品久久| 久久精品人人槡人妻人人玩AV | 婷婷伊人久久大香线蕉AV| 久久伊人色| 久久一区二区三区99| 亚洲精品tv久久久久久久久久| 久久国产亚洲精品| 伊人久久大香线蕉无码麻豆|