通信電纜 網絡設備 無線通信 云計算|大數據 顯示設備 存儲設備 網絡輔助設備 信號傳輸處理 多媒體設備 廣播系統 智慧城市管理系統 其它智慧基建產品
北京中新創科技有限公司
閱讀:4199發布時間:2011-12-26
大多數實時網絡游戲,將server的時間和client的時間校對一致是可以帶來許多其他系統設計上的便利的。這里說的對時,并非去調整client的os中的時鐘,而是把gameclient內部的邏輯時間調整跟server一致即可。
一個粗略的對時方案可以是這樣的,client發一個數據包給server,里面記錄下發送時刻。server收到后,立刻給這個數據包添加一個server當前時刻信息,并發還給client。因為大部分情況下,gameserver不會立刻處理這個包,所以,可以在處理時再加一個時刻。兩者相減,client可以算得包在server內部耽擱時間。
client收到server發還的對時包時,因為他可以取出當初發送時自己附加的時刻信息,并知道當前時刻,也就可以算出這個數據包來回的行程時間。這里,我們假定數據包來回時間相同,那么把server通知的時間,加上行程時間的一半,則可以將client時間和server時間校對一致。
這個過程用udp協議做比用tcp協議來的好。因為tcp協議可能因為丟包重發引起教大誤差,而udp則是自己控制,這個誤差要小的多。只是,現在網絡游戲用tcp協議實現要比udp有優勢的多,我們也不必為對時另起一套協議走udp。
一般的解決方法用多次校對就可以了。因為,如果雙方時鐘快慢一致的情況下,對時包在網絡上行程時間越短,就一定表明誤差越小。這個誤差是不會超過包來回時間的一半的。我們一旦在對時過程中得到一個很小的行程時間,并在我們游戲邏輯的時間誤差允許范圍內,就不需要再校對了。
或者校對多次,發現網絡比較穩定(雖然網速很慢),也可以認為校對準確。這種情況下,潛在的時間誤差可能比較大。好在,一般,我們在時間敏感的包上都會攜帶時間戳。當雙方時間校對誤差很小的時候,client發過來的時間戳是不應該早于server真實時刻的。(當時間校對準確后,server收到的包上的時間戳加上數據包單行時間,應該等于server當前時刻)
一旦server發現client的包“提前"收到了,只有一種解釋:當初校對時間時糟糕的網絡狀態帶來了很多的時間誤差,而現在的網絡狀態要明顯優于那個時候。這時,server應該勒令client重新對時。同理,client發現server的數據包“提前"到達,也可以主動向server重新對時。
一個良好的對時協議的設定,在協議上避免client時間作弊(比如加速器,或者減速器)是可行的。這里不討論也不分析更的利用游戲邏輯去時間作弊的方式,我們給數據包打上時間戳的主要目的也非防止時間作弊。
校對時間的一般用途是用來實現更流暢的戰斗系統和位置同步。因為不依賴網絡傳輸的統一時間參照標準可以使游戲看起來更為實時。
首先談談位置同步。
好的位置同步一定要考慮網絡延遲的影響,所以,簡單把entity的坐標廣播到clients不是一個好的方案。我們應該同步的是一個運動矢量以及時間信息。既,無論是client還是server,發出和收到的信息都應該是每個entity在某個時刻的位置和運動方向。這樣,接收方可以根據收到的時刻,估算出entity的真實位置。對于server一方的處理,只要要求client按一個頻率(一般來說戰斗時10Hz即可,而非戰斗狀態或player不改變運動狀態時可以更低)給它發送位置信息。server可以在網絡狀態不好的情況下依據zui近收到的包估算出現在player位置。而client發出的每次player位置信息,都應該被server信任,用來去修正上次的估算值。而server要做的只是抽查,或交給另一個模塊去校驗數據包的合法性(防止作弊)。
在server端,每個entity的位置按10Hz的頻率做離散運動即可。
client因為涉及顯示問題,玩家希望看到的是entity的連續運動,所以處理起來麻煩一點。server發過來的位置同步信息也可能因為網絡延遲晚收到。client同樣根據zui近收到的包做估算,但是再收到的包和之前已經收到的信息估算結果不同的時候,應該做的是運動方向和速度的修正,盡可能的讓下次的估算更準確。
關于戰斗指令同步,我希望是給所有戰斗指令都加上冷卻時間和引導時間,這正是wow的設計。這樣,信任client的時間戳,就可以得到client準確的指令下達時間。引導時間(或者是公共冷卻時間)可以充當網絡延遲時間的緩沖。當然我們現在的設計會更復雜一些,這里不再列出。對于距離敏感的技能,例如遠程攻擊和范圍魔法,我們的設計是有一個模糊的miss判定公式,解決距離邊界的判定問題。
這里,server對攻擊目標的位置做估算的時候,可以不按上次發出包的運動方向去做位置估計,而選擇用zui有利于被攻擊者的運動方向來做。這樣,可以減少網絡狀況差的玩家的劣勢。
對于PVE的戰斗,甚至可以做更多的取舍,達到游戲流暢的效果。比如一個網絡狀態差的玩家去打npc,他攻擊npc的時刻,npc是處于攻擊范圍之內的。但是由于網絡延遲,數據包被server收到的時候,npc已經離開。這個時候server可以以client的邏輯來將npc拉會原來的坐標。
雖然,這樣做,可能會引起其他玩家(旁觀者)client上表現的不同。但是,網絡游戲很多情況下是不需要嚴格同步的。在不影響主要游戲邏輯的情況下,player的手感更為重要。
:王
智慧城市網 設計制作,未經允許翻錄必究 .? ? ?
請輸入賬號
請輸入密碼
請輸驗證碼
請輸入你感興趣的產品
請簡單描述您的需求
請選擇省份