Quake體系結構

2021-09-01 20:41:52 字數 2728 閱讀 1228

在學習quake3原始碼時, 有必要先從總體上了解 quake 的設計思路和結構。

以下內容主要來自michael abrash對quake的綜述(quake1到quake3總體結構變化不大),原文見

doom採用的是乙個對等的網路體系結構(peer-to-peer),其中每個玩家機器執行一致的遊戲引擎。這種方式對於只有兩個玩家的遊戲非常好,但是對於支援多人遊戲,即通過internet網的遊戲則非常困難,所以quake採用了不同的網路體系結構。

quake是乙個client-server模式的程式,如下圖所示:

所有的遊戲動作和模擬計算都在伺服器上進行, 而所有的輸入,輸出則放在客戶端處理。每個客戶端為每一幀處理鍵盤,滑鼠,遊戲柄事件,並傳送訊息給伺服器。伺服器收到這些訊息後,在乙個指定的時間片內(幀頻率以內)完成計算,並返回處理結果給客戶端。客戶端在下一幀資料接受之前渲染這些結果。這種方式在單人模式下也是一致的。即伺服器和客戶端在乙個程序內,之間通過memory buffers通訊。在多人模式下,客戶端和伺服器在不同的程序裡,執行在不同的機器上。

client-server模式對於多人遊戲是非常有利的,因為它提供了多玩家直接的簡單同步機制。甚至在單玩家模式下, client-server也是有用的,它可以支援更好的除錯。

1. 通訊

對於client-server模式來說,最感興趣的就是能夠通過internet來玩遊戲。 quake從一開始就被設計為支援多人遊戲,包括通過internet。但是通過internet通訊要比在通過lan通訊有更多的通訊延遲,甚至資料報丟失。

在早期,quake採用了可靠的資料傳輸方式。在這種方式中,資料報傳送出去後,必須得到對方確認的訊息,如果沒有收到確認訊息,則整個遊戲將停止直到重發成功。為了減少訊息傳送的數量,客戶端應該只傳送那些會導致遊戲狀態改變的訊息。當然如果客戶端發生改變遊戲狀態的訊息,但是沒有傳送給伺服器,則累計一定時間後,整個遊戲世界的狀態都將是不正確的。

可靠的資料傳輸方式的問題是如果資料報丟棄了,它需要花很長的時間去等待,然後重發。如果伺服器到客戶端 ping的時間為 200ms,則乙個丟棄的資料報會導致幾個200ms的時間延遲。

現在,quake僅僅使用可靠資料傳輸方式來傳輸一些關鍵資訊,如分數,等級變化等。對於當前遊戲狀態,如玩家位置,物品位置等,它只在一定時間間隔傳送,而不是這些資料一變化就廣播這些資料給所有相關的客戶端。並且這些資訊的傳送並不要求確認報文。即採用的是發出去後不管的原則。

2. 延遲

client-server模式潛在地帶來了玩家動作大的延遲,如按下跳躍鍵,玩家就可以看到結果,比如他的視角變成了天空。這個動作先得傳送給server, 然後再返回。 在lan中, 這個延遲非常接近no time,而在internet中,則會有幾百ms的延遲。長延遲導致遊戲非常的難玩。這個問題帶了了一種可能性:即在客戶端和服務端都執行一些遊戲邏輯, 這樣客戶端可以提高響應速度。

快速的響應大部分時間都能工作的很好,但是對於客戶端的模擬計算則存在一些嚴重的問題。首先它使得通訊和遊戲邏輯變得非常複雜,因為不是只有乙個在伺服器上的中心模擬器,而是有一打或更多的模擬器需要同步。 這樣就是要求客戶端模擬器在有衝突產生的時候,有乙個機制來判斷哪些決策是對的, 然後回滾其他的模擬器中的一些動作。非常地糟糕,這是乙個不可避免的悖論,如乙個玩家發**乙個火箭,然後看到它擊中了對手並且導致對手死亡,但是過了一會他發現對手奇蹟般地復活了。然後 quake也存在一些延遲,但是它不會產生上述情景。

3. 伺服器

quake伺服器維護著遊戲的時間和狀態,執行物件的移動,物理計算,和怪物ai。對於伺服器方面來說,大部分感興趣的是資料驅動模型。世界的描述是通過物件的位置和型別,牆的位置,還有儲存在資料庫中的相關資訊來體現的。物件和怪物的行為都是通過程式設計實現的,通過內建的直譯器, quake-c控制。 quake伺服器是由資料庫驅動的,玩家不僅可以增加新的世界場景,還可以建立新的遊戲元素,如能自動鎖定目標的高階火箭筒, 自動導航的飛機等,這些都不需要寫一行的c或彙編**。這種靈活性不僅使得quake成為乙個開發性的平台,而且可以讓更多的人參與到遊戲的開發中(不需要重新編譯**)。甚至我們可以在quake伺服器執行中增加新的世界場景和quake c程式。

如果你想看看quake-c的**是啥樣的,可以到

去看看。

4. 客戶端

伺服器和通訊層是quake關鍵部分, 但是客戶端才是玩家直接面對的, 客戶端實現了乙個3d引擎。客戶端處理鍵盤,滑鼠,遊戲手柄,聲音混合,和2d畫圖如選單,工具欄,訊息欄等,這些不是複雜的部分。真正的創造性的是3d引擎。 quake 3d引擎的挑戰主要是兩個方面:支援所有角度3d觀察(而不是doom的2.5d),採用光照提高了影象逼真度,更精確的畫素繪製。當然quake 3d在效能上也是獨一無二的。

和伺服器一樣, 3d引擎也是資料驅動的, quake的資料主要分成兩類:the world和the entities。每個場景都包含一些牆的幾何體,門,和一些需要畫到這些表面的紋理(bitmaps)。quake引擎記憶體儲存了三角形mesh, 玩家的紋理, 怪物和其他可移動的物件,即entities。最早,我們計畫是在乙個渲染通道中完成這些顯示工作。但是考慮到大量的牆,怪物和成百的多邊形在乙個通道中渲染效率比較低。現在已經採用了不同的方式來做並行渲染了。

世界被儲存在乙個bsp樹的資料結構中。 bsp樹非常的容易理解,這裡就不列出細節了,後面有專門針對bsp的解釋。對於quake來說, bsp樹帶來了兩個好處:多變形裁剪變得很容易,分割的空間都是凸多邊形的。

關於 pvs有一點就是:它的計算代價是非常大的。在四處理器的alpha系統中做一次pvs計算需要15到20分鐘。

quake光照技術帶來了更加真實的光源和陰影。它為每個多邊形通過執行乙個單獨的光照對映(基本上是乙個紋理圖)。

mysql 體系結構 了解MySQL體系結構

mysql 資料庫體系結構圖 mysql 由以下幾部分組成 1 connectors 不同語言中與 sql 的互動 show variables like connection variable name value character set connection utf8 collation c...

簡述mysql體系結構 MySQL體系結構

一 mysql登入方式 一 tcp ip方式 遠端 本地 mysql uroot poldboy123 h 10.0.0.51 p3306 二 socket方式 mysql uroot poldboy123 s tmp mysql.sock 二 例項介紹 例項 mysqld後台守護程序 主線程 ma...

軟體體系結構 軟體體系結構概論

開學到現在我已經上了三節軟體體系結構的課程,現在我想把自己學到的整理歸納一下。此篇隨筆對應於教材軟體體系結構概論一章。首先談一談我剛接觸這門課程是的感受。那就是 我靠 軟體也會有體系結構?以前只學過資料結構 演算法 基本的程式語言,覺得程式設計無非就是使用者給我需求,我便按照需求來程式設計序就好,從...