網(wǎng)路的硬件也有限,而人的創(chuàng)造也無限,在公網(wǎng)平均130ms的Latency下,是不存在“完全的”的同步情況。如何通過消除/隱藏延時,將用戶帶入快速的交互式實時游戲中,體驗完美的互動娛樂呢?
以下六點,將助你分清楚哪些我們可以努力,哪些我們不值得努力,弄明白實時游戲中同步問題關(guān)鍵之所在,巧妙的化解與規(guī)避游戲,最終在適合普遍用戶網(wǎng)絡(luò)環(huán)境中(200ms),實現(xiàn)實時快速互動游戲:
1. 基本情況:
(A) 網(wǎng)絡(luò)性能指標一:帶寬,限制了實時游戲的人數(shù)容量
(B) 網(wǎng)絡(luò)性能指標二:延時,決定了實時游戲的最低反應(yīng)時間
2. 兩個基本原則:
(A) 讓所有的用戶屏幕上面表現(xiàn)出完全不同的表象是完全沒有問題的。
(B) 把這些完全不同表象完全柔和在一個統(tǒng)一的邏輯中也是完全沒有問題的。
3. 同步的十二條應(yīng)對策略:
(A) 最大可能減少游戲中的數(shù)據(jù)傳輸
(B) 將阻塞通信放到線程池中實現(xiàn)
(C) 永遠不要為了等待某個數(shù)據(jù)而不讓游戲進行下去
(D) 利用預測和插值改進游戲的效果
(E) 當使用預測插值的時候傳送的數(shù)據(jù)不僅包括坐標,還需要速度和加速度
(F) 將輸入數(shù)據(jù)枷鎖或者隊列化(例如鍵盤消息隊列),直到下次發(fā)送數(shù)據(jù)的時刻,傳統(tǒng)的方法是在固定的時間(發(fā)送數(shù)據(jù)前)檢測鍵盤,在游戲的原理上隱藏延時
(G) 使用事件調(diào)度表,將需要在所有用戶客戶端同時發(fā)生的事件,提前廣播到所有用戶
(H) 使用多次攻擊來殺死一個精靈,盡量減少一次性的、確定性的、延時敏感的事件
(I) 延長子彈或者火箭在空中飛行的時間(在其飛行的同時,在所有客戶端進行預測插值)
(J) 所有物體從一個地方移動到另外一個地方都需要時間,避免諸如“瞬間移動”的設(shè)計
(K) 盡量使游戲中所有精靈,飛船或者其他物體,都按照可預測的軌跡運行,比如在移動中增加慣性
(L) 充分發(fā)揮創(chuàng)造力,盡最大可能的合并游戲中前后相關(guān)的事件,合并游戲中存在的延時此問題,需要在技術(shù)上改進的同時也需要策劃有所重視,規(guī)避一些影響較大的設(shè)計,巧妙的隱藏"延時"
4. 同步問題現(xiàn)狀:
(A) 重視程度不夠:很多人尚未意識到此問題的存在,曾有公司花半年時間打算做一款“松鼠大戰(zhàn)”的網(wǎng)絡(luò)版。
(B) 技術(shù)上無徹底解決方案:對于多數(shù)程序員,單機游戲技術(shù)善未成熟就匆匆步入網(wǎng)絡(luò)時代。
(C) 研究這個技術(shù)需要條件:需要有實力的公司才能提供,無此條件,即便有能力的程序員也無法成功。
5. 目前網(wǎng)游的三大技術(shù)難題:
(A) 服務(wù)器的響應(yīng)問題:如何使服務(wù)器在支持越來越多的人數(shù)的情況下提供最高的響應(yīng)。
(B) 同步問題:如何在有限的網(wǎng)絡(luò)響應(yīng)情況下,實現(xiàn)快速實時類游戲,提供最完美的交互。
(C) 服務(wù)器分布式問題:如何在統(tǒng)一用戶數(shù)據(jù)的情況下,利用分部式將各個分散的“世界”統(tǒng)一到一個“世界”中。
誰能真正解決好以上三個問題,配合策劃在設(shè)計上的突破,將使其他人在至少兩年內(nèi)無法超越。
6. 相關(guān)補充:
(A) 網(wǎng)格技術(shù)現(xiàn)在還是抄作,真正用到游戲中,還有很多技術(shù)難點需要突破(比如:目前網(wǎng)格的單位計算時間是以秒計算).
(B) 其實與很多人想法相反的是現(xiàn)在3D技術(shù)早已不是主要的矛盾。而現(xiàn)在國內(nèi)外對于以上三個問題可以說處于同一個起跑線上,完全有機會取得先機。
(C) 現(xiàn)在解決同步問題已經(jīng)很緊迫,而同時所需要的環(huán)境也已經(jīng)成熟,只要有所關(guān)注,半年之內(nèi)可以得出較成熟的結(jié)論
那么具體怎么解決呢?再下一步怎么辦?
這就得自己去實踐了,我只說這么多了,哈哈,不然又教懶了那些成天再網(wǎng)上搜方案的人。
MMO的同步策略目前已經(jīng)沒有什么秘密可言了,簡單敘述下各要素:
MMO人行走:MMO中如果是鼠標點擊行走傳目的地+中間尋路接點就行了,服務(wù)器簡單驗證一下。如果是鍵盤控制行走的話,需要做簡單的預測插值。
MMO打怪:要看怎么個打法,客戶端根本不必管服務(wù)端什么時候傳來消息,直接演示動畫就行了,最好把被砍的過程動畫做長一點,可以在播放動畫的過程中等待服務(wù)器傳過來的延遲敏感事件,比如--該人已死。這樣處理起來比較容易,最重要的是客戶端看起來要流暢。
MMO插值:所謂“把不同表象柔和在一起”算法很多,簡單的可以參考DR,位置不同的時候可以做一次線性插值,直接把人拉扯過去,或者二次線形插值,做一條平滑的曲線修正,看具體項目選擇了。
時鐘:就是時鐘同步,所有時鐘都是以“貞”為單位的,服務(wù)器主邏輯循環(huán)可以是5-10fps,多則無益,客戶端同樣維持一個和服務(wù)端頻率相同的消息同步貞。
時間貞:把ping值加到時間計算里面是多余的,按貞計算的話,服務(wù)端告訴客戶端在n貞發(fā)生xx事件的時候,客戶端收到的時候如果客戶端貞數(shù)大于n,說明是發(fā)生過了的,那么做插值,如果小于n,說明是未來發(fā)生的,那么加入時間表。
1 游戲中的行走,則是一個需要同步的重頭戲,當今游戲分成兩種同步方式,一種是以服務(wù)器端為準,如果發(fā)現(xiàn)客戶端的坐標和服務(wù)器的坐標不符合的話,則拉回。這點的好處是可以彌補瞬移外掛的出現(xiàn),但在網(wǎng)絡(luò)環(huán)境差的情況下,則出現(xiàn)游戲不流暢。
所
以,我比較推薦使用以客戶端計算為準的方法(當然是我因為我這個游戲?qū)τ螒蛄鲿承砸蠛芨撸蛻舳讼蚍?wù)器發(fā)送計算好的數(shù)據(jù),服務(wù)器經(jīng)過一定的預測判
斷,廣播給其他玩家,這個雖然是能引起和wow一樣的問題,瞬移外掛,但完全可以從游戲設(shè)計方面進行根本避免。(這里就不談策劃方面的問題了)
2
游戲的戰(zhàn)斗,戰(zhàn)斗的同步性要求也相當高,這里我也引用樓主說的,在固定時間檢測鍵盤,以一定頻率發(fā)送攻擊消息,這里有一個關(guān)鍵,就是服務(wù)器和客戶端都進行
攻擊判定,即使服務(wù)器中沒有攻擊判定成功,但在客戶端判定成功,也要播放攻擊效果。不過一切計算效果以服務(wù)器為準。這是一個欺騙玩家的手段。
posted on 2009-09-12 10:39
暗夜教父 閱讀(4490)
評論(2) 編輯 收藏 引用 所屬分類:
Game Development