遊戲引擎的層級架構

2021-06-08 06:45:32 字數 1951 閱讀 1002

遊戲程式的領域中,最常聽到的專有名詞,可以說是非game engine(遊戲引擎)莫屬了。聽起來是個很炫很酷的名詞,但其實遊戲引擎一詞經常被過度泛稱與誤用。所謂的遊戲引擎架構,由低階 (low-level) 至高階 (high-level) 可細分為以下三個層級 (layer)

繪圖 api,負責掌管程式與硬體間的溝通,將硬體層的功能與特徵抽象化,提供一組標準化的介面供程式設計者使用。目前 directx 與 opengl 已成為業界兩大標準。此層級屬於繪圖底層的規格化與標準化,有利於引擎與遊戲開發者以及整個業界的發展,使開發者可以專注在更具體與遊戲相關的引擎架構上,而不會受制於各家廠商不同硬體實做內容所產生的限制。

繪圖引擎,將底層的繪圖 api 包裝成與實做無關的介面,甚至能夠提供數種不同平台的繪圖 api 以供跨平台開發使用,更進一步的為程式設計者帶來許多的功能性以及便利性。使用繪圖引擎對於開發者來說最大的益處,就是可以使用以繪圖 api 建構起來的各種繪圖架構與技術,例如 scene graph 架構、空間分割、資源管理、光影處理等等。

除了上述的繪圖 api、繪圖引擎與遊戲引擎層級之外,還有乙個稱為遊戲框架 (game framework)的層級。在軟體開發的領域中,所謂的 framework 是指乙個在軟體系統中可重複利用的設計。與遊戲相關的著名框架系統有用來開發 xbox360 遊戲的 xna framework 與微軟大力推行的 .net framework。框架系統需要能在提供現成實做版本的情況下,同時保留具有彈性且可擴充的介面,以期達到框架的可重複利用性。

此外,由於遊戲產業的蓬勃發展,專注於開發繪圖引擎與遊戲引擎的公司也越來越多,於是出現了乙個新興的專有名詞稱之為middleware(中介軟體)。中介軟體是用來提供某特定層面的功能性元件,目的在於節省遊戲開發的時程與風險,包含像是繪圖引擎、物理引擎、人工智慧引擎、音效引擎等等都可以算是中介軟體的一種。目前也有中介軟體開發廠商,提供包含伺服器端與客戶端程式在內,開發 mmo 遊戲的完整解決方案。

在遊戲程式開發中,最困難的關鍵點往往在於各層級間的橋接與溝通部分。對於各個層級,開發者需要盡可能使它們達到彼此獨立不相依的情況,減少各層級之間的耦合性,在這樣的設計模式之下,才有利於達到元件化、層級化的高度可再利用遊戲引擎。簡而言之,也就是將介面與實做分離的設計概念。在最理想的情況下,希望能夠將引擎框架的泛用程式碼和特定遊戲相關的程式碼兩部分完全分離而治,以期達到在引擎相關程式碼變動最少的情況之下,能夠提供給不同的遊戲程式碼來使用。

遊戲引擎所提供的功能,就像是玩樂高 (lego) 玩具一樣,我們可以使用積木箱裡各種不同形狀的基本積木,組合出夢想藍圖中的巨大模型。這些基本積木就像是遊戲引擎中的各種元件,可以根據不同遊戲專案的不同需求,取出合適的積木元件拼湊組合成為乙個完整的遊戲。而這個從積木組成模型的步驟,則需要乙個規格化、標準化的程式,使得「組裝」這個動作,變得很直覺易懂,無論未來積木的內容材料是否有改變,都不會對使用者造成太大的影響。積木的「組裝」動作就像是程式的「介面」一樣,任意變動積木的組合方法或是介面的使用方法,都會造成使用者的困擾與不便,並且大幅降低複製使用經驗的可能性。

然而在真正的開發過程中,我們可能會發現,要達成各層獨立、介面實做分開是非常不容易的任務。特別是在程式架構不良的情況下,會使得日漸龐大的遊戲程式碼層層交疊、錯綜盤根,就像是地基不穩卻又拼命往上加蓋的高樓一樣搖搖欲墜。因此正如 《design patterns》 書中的設計思維所述:應該著力於將「變動」與「不變動」的部分抽離分開,分別封裝「變動」與「不變動」的概念,才能夠將進行變動時所需耗費的心力降至最低。

遊戲引擎架構

大綱 什麼是架構?軟體架構是乙個系統的草圖,軟體架構描述的物件是直接構成系統的抽象元件。各個元件之間的連線則明確和相對細緻地描述元件之間的通訊。在實現階段,這些抽象元件被細化為實際的元件,比如具體某個類或物件。在物件導向領域中,元件之間的連線通常用介面來實現。什麼是遊戲引擎?引擎 定義元件最重要的是...

遊戲引擎架構 2

世界的燈光 在變換過程中,通常是在稱為觀察空間的座標空間中,我們遇到了最重要的運算之一 光照計算。它是一種這樣的事情,當它工作時,你不關注它,但當它不工作時,你就非常關注它了。有很多不同的光照方法,從簡單的計算多邊形對於燈光的朝向,並根據燈光到多邊形的方向和距離加上燈光顏色的百分比值,一直到產生邊緣...

《遊戲引擎架構》讀書筆記(二)

1 基礎除錯 a 日誌及追蹤,有些bug難以用vs自帶的除錯來進行單步除錯,最好的解決方案就是printf除錯法,列印一組資料,觀察情況。之前我的做法是單獨生成乙個控制台,不過vs自帶了乙個outputdebugstring 的方法,可以列印除錯資訊。不過這個只支援char 內容,我們可以將這個函式...