遊戲引擎剖析(七)

2021-05-09 20:15:38 字數 2492 閱讀 5212

第7部份: 網路和連線遊戲環境

網路遊戲

我記得一些年前坐在gdc(遊戲開發者大會)聽負責開發x-wing vs tie fighter的傢伙們題為「淹沒在internet」 的演講,全是關於讓網路遊戲實時地在internet上工作的東西。他們選擇那個題目是多麼的正確啊。當它開始處理資料報的丟失,亂序,潛伏(乙個資料報傳送到它的目的地所花的時間)等等時,它確實淹沒了。然而它是可能的。對於internet需要一些聰明和經驗,但它是肯定可能的。看看今天大量的連線遊戲,從quake iii,unreal tournament,counter strike一直到everquest和ultima online。

如今大多數真正有長久生命力的遊戲都至少有一些連線成分。最純粹的單人遊戲容易玩一次,也許兩次,或者甚至三次如果它是非常好的遊戲,但一旦遊戲結束,就被束之高閣了。如果你想要有任何長久生命力,那麼多人連線遊戲就是形勢的核心所在,並且那意味著和internet打交道,為編碼者開啟了那個潘多拉的盒子。

那麼跟internet打交道包括些什麼呢?首先是要理解internet是怎麼工作的,和點對點與客戶機/伺服器體系結構的快速討論。點對點就是你在兩台機器上執行遊戲,並簡單地在它們之間共享輸入。每個單獨的遊戲假定它是正確的,並僅僅在它一幀接一幀的重新整理中合併來自另外一台機器的輸入。客戶機/伺服器是一台機器有效地執行遊戲,別的機器僅僅是乙個終端,接受來自玩家的輸入,並渲染伺服器讓它渲染的任何東西。

客戶機/伺服器的優點是每台機器都將會展現相同的遊戲,因為所有的處理都在乙個地方完成,沒有跨越多台機器,你可以不用考慮每台機器相互之間的同步問題。不足之處是,伺服器本身需要有一些重要的cpu可用時間來處理每乙個連線的客戶機,和乙個合適的網路連線來確保每乙個客戶機及時地接收到它的更新。

tcp/ip和udp/ip是兩層的通訊協議系統。ip層負責網際資料報的傳輸。udp或者tcp層將大的資料報傳給ip,ip將資料報分割為小的子資料報,為每個資料報加上乙個信封,計算出目的地的ip位址,應該如何到達那裡,然後將資料報傳送到你的isp,或者不管怎樣你連線到網路。 這實在象是在一張明信片上寫下你要傳送的,貼上郵票,寫上位址,塞進乙個郵箱,它就送走了。

udp和tcp是從你編碼者或者遊戲接收資料報的高層協議,並決定該如何處理這些資料報。udp和tcp的區別在於tcp保證資料報的傳送和有序,而udp不保證。udp是一條直接和ip對話的小路,而tcp是在你和ip之間的乙個介面。它像是在你和你的郵件之間有乙個管理員助手。使用udp你會自己為你的信打字,把它們放進乙個信封等等。使用tcp你會僅僅向你的管理員口授信稿,管理員會做全部的工作並追蹤確認信件送到了。

客戶端**

因為 udp 明顯的是快速響應遊戲的方式,我們將必須自己處理資料報的丟失和亂序。邊而且這是技巧所在。不用說出太多的**秘密,我就能說有方法。作為開始,有客戶端預言,乙個被談論得相當多的詞語。當你作為乙個客戶端連線到乙個大的伺服器,但是不能連貫地看見來自伺服器的更新,客戶端預言開始起作用了。正在你的電腦上執行的遊戲部分看著你正給它的輸入,並在缺乏來自伺服器的任何棄絕資訊的情況下,對它認為將繼續進行的事情作出『最好的猜測』。它將會顯示被猜測的資料,然後當它得到來自伺服器的世界的最新狀態時,改正它自己,如果需要。你可能會對這個方法的效力感到驚訝。大體而言,大部分時間資料報不容易丟失—大多數時候是一秒的幾十分之一,這種情況下遊戲沒有太多的時間偏離伺服器實際上認為正在發生的事情。偏離確實會隨著時間變的比較大,大多數遊戲裡面有乙個超時功能,當出現很長時間沒有來自伺服器的聯絡時就停止遊戲。

請注意,寬頻並不總是能解決延遲問題。你仍然受最慢的路由器/伺服器和資料報從伺服器穿越網路到達你的跳數(反之亦然)的支配。有乙個寬頻連線確實容易緩和這些,但不可能它們最後就消失了。當然,如果你打算要執行某種伺服器,你將會需要乙個具有足夠快速的向上游的資料速率的頻寬,因為僅僅乙個數據機不能夠處理乙個伺服器產生的負荷。

值得一提的是,如果你想要在ps2或者xbox上面玩網路遊戲,你將需要乙個寬頻連線,因為它們兩者都不支援數據機。

包大小,智慧型資料傳輸,和反作弊

別的必須被處理的事情是資料報的大小。如果你在乙個遊戲裡面64個人都在跑來跑去相互攻擊,從一台機器傳送到另外一台機器的資料報能變得相當大,達到了一些數據機沒有頻寬處理這些資料的程度。這正在變得特別和那些有著很大的地表系統的遊戲有關。這裡增加的問題是,因為你有這個很好的地表系統,你能夠看得很遠,因此能夠看見許多其他遊戲玩家,使得你為了精確渲染所需要的來自伺服器的資料數量以很快的速率增長。我們能做什麼呢?

還有一些其他的事情也要處理。最近已經有大量的令人苦惱的連線作弊正在發生。這是某些人修改遊戲以給他們不正當利益的地方。儘管嚴格意義上這不是網路的一部分,但它確實發生了。有時人們會創作一些模組,允許他們立即瞄準進入視野的任何人,或者簡單地允許他們看穿牆壁,或者讓其他遊戲玩家看不見他們自己。大部份時間這些事情可以在網路層內部或者在伺服器上被處理。任何有100%命中率的人被簡單地踢出遊戲,因為在人力所及的範圍內那是不可能的。

遊戲開發者必須盡一切可能制止作弊行為,但很不幸,人做的東西可以被人突破。所有你能做的就是讓作弊變得困難,當確實發生時去嘗試發現它。

好吧,現在就到這裡了。在第8部分中,我們將會看看遊戲指令碼系統的趣味世界,根據遊戲過程中出現的事件來渲染或使能預先定義的場景和行為,協助故事敘述。 

遊戲引擎剖析(七)

第7部份 網路和連線遊戲環境 網路遊戲 我記得一些年前坐在gdc 遊戲開發者大會 聽負責開發x wing vs tie fighter的傢伙們題為 淹沒在internet 的演講,全是關於讓網路遊戲實時地在internet上工作的東西。他們選擇那個題目是多麼的正確啊。當它開始處理資料報的丟失,亂序,...

遊戲引擎剖析(二)

第2部份 3d環境的光照和紋理 世界的燈光 在變換過程中,通常是在稱為觀察空間的座標空間中,我們遇到了最重要的運算之一 光照計算。它是一種這樣的事情,當它工作時,你不關注它,但當它不工作時,你就非常關注它了。有很多不同的光照方法,從簡單的計算多邊形對於燈光的朝向,並根據燈光到多邊形的方向和距離加上燈...

遊戲引擎剖析(六)

第6部分 聲音系統,音訊apis 聲音系統 現在有一些很少有處理的聲音空間化問題。我說的是把聲音放在乙個真實的3d世界中。有四個揚聲器在你周圍是乙個很棒的開始,但這仍然只是在二維方向。在你的上方和下方沒有揚聲器,你沒有真正獲得3d聲音。有一些聲音調製過濾器試 決這個問題,但實際上沒有真實東西的代替物...