呵呵,一年前的這個時候發過一系列討論網路遊戲同步的帖子。
一年後的今天,再重新討論討論這個問題。。。
不知道大家是否碰到過這種情況,當某個玩家發出乙個火球,這個火球有自己的運動
軌跡,那麼如何來判斷火球是否打中了人呢?大部分情況,當策劃提出這個要求的時
候,一般會被程式否認,原因是:太麻煩了,呵呵。複雜點的還有包括兩個火球相撞
之類的事情發生。
那麼網路遊戲中,是否真的無法模擬實現這種模擬呢?
首先我們來看看模擬此種操作會帶來什麼樣的麻煩:
1,伺服器必須trace火球的執行軌跡,乍一想,挺慢的。
2,網路延遲,傳過來有延遲,傳過去有延遲,延遲還不穩定,麻煩。
3,都有兩點解決不了了,接下來不願意再想了。
呵呵,實際上呢,對火球的模擬比對人物運動的模擬要輕鬆很多,原因很簡單,火球
的方向不會變。下面來看看具體用什麼樣的結構來實現:
不知道大家是否還記得我去年這個時候提到過的dead reckoning演算法,我們要模擬火
球運動的關鍵就在於乙個叫moving objects tracing server的伺服器程式,這個服務
器是幹什麼的呢。這個伺服器接收主遊戲伺服器發過來的註冊事件的資訊,比如有個
玩家,開始移動了,那麼主遊戲伺服器就把該玩家的運動pdu,包括方向,速度,加速
度,起點發給mots (moving objects tracing server),然後mots自己開始對其執行
進行模擬,當遊戲伺服器發來第二個pdu包的時候,則對各個物件的位置進行修正,並
重新開始模擬。那麼,我們模擬的目的是什麼呢?當然是發生某些事件,比如說碰撞,
或者掉入地圖的某個陷阱的時候,會將該事件回發給主邏輯伺服器。然後邏輯伺服器來
處理該事件。
那麼,對於火球的處理,也和處理其他玩家的同步一樣,當接收到玩家的發火球的指令
以後,產生乙個火球,並指定其pdu資訊,在mots上註冊該個運動物體。當mots自行模
擬到這個物體和其他玩家或者npc物體產生碰撞,則通知主邏輯伺服器,然後主邏輯服
務器產生相應的動作。
那麼關於延遲呢?有些人也許會說,比如說前面有個火球,我本地操縱的小人其實躲過
去了,但是因為網路延遲,在伺服器上我並沒有躲過去,那麼怎麼算?呵呵,不知道大
家玩過星際沒有,有沒有發現在星際中玩多人連線模式的時候,有一點最特別的地方,
就是控制乙個小兵的時候,點了地圖上的某個位置,但是小兵並不會馬上開始移動,而
是有一定的延遲,但是這一小點延遲並不能掩蓋星際的經典,同樣的理論用到這裡也成
立。對於客戶端的控制,當玩家操縱的主角改變pdu資訊的時候,確保資訊傳送到服務
器之後,再開始處理本地的操作指令,這樣就能保證本地的**和伺服器的**幾乎是
沒有什麼誤差的,即使有很小的誤差產生,以伺服器為主,這樣玩家也不會有太大的抱
怨。
網路遊戲同步問題
介紹 作為乙個程式,你想過網路多人對戰遊戲是怎麼做出來的嗎?從外行的角度來看多人對戰遊戲是很神奇的 2個或者更多的玩家在同乙個時間經歷了相似的遊戲經歷,感覺他們就像在同乙個虛擬世界中遊戲一樣。但是作為程式設計師我們卻知道事實並不是他們想象的那樣的,他們看到的絕大多數其實都是假象。他們所認為玩家間同時...
網路遊戲同步問題
介紹 作為乙個程式,你想過網路多人對戰遊戲是怎麼做出來的嗎?從外行的角度來看多人對戰遊戲是很神奇的 2個或者更多的玩家在同乙個時間經歷了相似的遊戲經歷,感覺他們就像在同乙個虛擬世界中遊戲一樣。但是作為程式設計師我們卻知道事實並不是他們想象的那樣的,他們看到的絕大多數其實都是假象。他們所認為玩家間同時...
網路遊戲同步法則
網路的硬體也有限,而人的創造也無限,在公網平均130ms的latency下,是不存在 完全的 的同步情況。如何通過消除 隱藏延時,將使用者帶入快速的互動式實時遊戲中,體驗完美的互動娛樂呢?以下六點,將助你分清楚哪些我們可以努力,哪些我們不值得努力,弄明白實時遊戲中同步問題關鍵之所在,巧妙的化解與規避...