淺談 抽象化 和 遊戲引擎


抽象化

    如果想要進行遊戲開發,首當其衝的是遊戲引擎的部分,但在談起遊戲引擎前,就要先正一下視聽,淺談一下什麼是遊戲引擎。

    之所以想特別談這個話題是因為幾年前我在Youtube上看到一個遊戲的專題影片談到遊戲引擎,該Youtuber認為引擎這個名字並不符合遊戲引擎在遊戲開發的角色,遊戲引擎應該更類似於一個編輯器。然而這說法顯然並不準確,而且還存在一定程度的困惑性。

要認識所謂的遊戲引擎前,就必須先了解在Computer Enginnering裡的一個專有名詞,叫做「Abstraction」,一般譯作「抽象化」,這個詞彙源自於英國哲學家法蘭西斯‧培根的着作中,它的意義在於把多個概念(Ideas)或多個特定的事實(Facts)進行歸納和合併,進而建立一個更一般性,更範用的詞彙或理論。有聽沒有懂是正常的,在此列舉一個例子來說明。

假我們正在觀察一個物件 :
1. 該物件由去氧核醣核酸(DNA)組成
2. 該物件由蛋白質組成
3. 該物件有新陳代謝
基於上述的觀察到事實,我們把其叫作「生命」,
而這就是一個抽象化的過程。

(雖然抽象化是個哲學用詞,但在生活當中其實非常常見。
一個男性、外表好看,我們會把這一類人稱為帥哥,這也是抽象化的一種。
在論文的最前部分,通常會有一個Abstract段落,其用處也是把整個論文所觀察到的
事實和概念進行一次歸納。)

 

 電腦裡抽象化

    而在後來電腦的發展的過程中,軟、硬體的結構都逐漸變得複雜和庸腫,抽象化這個概念也被引用至電腦科學中,用來把繁瑣的概念簡化、世俗化,到了現在大多數電腦科學的用詞都有若深若淺的抽象化色彩在,像API、驅動器,乃至於程式語言的存在也是為了把複雜的機器語言抽象化。這裡也提醒一下初學者,對於學習成為開發者或者電腦科學的學習者而言,要特別「分清」一個專有名詞的抽象化程度,並且不要太過執着於「理解」這些高度抽象化的名詞,例如,API、Data Lake、Webhook等等詞彙,原因在於這些高度抽象化的名詞都離實務的開發太遠,對於初學者而言經常會有「我看不懂!」的錯覺,結果就是「C++從入門到放棄」。

但這些高度抽象化的名詞本來就不是用來理解的,而更多是一個用於溝通的泛用性概念,例如你問帥哥的組成是什麼,我相信也沒有什麼人能很精確的、很細緻的告訴你。在不同情境下也會有不同的意義,例如在早餐店阿姨口中的帥哥,明顯的與其餘時間的帥哥是有不同的意涵。API這個詞在嵌入式開發和網絡開發這兩個範疇就有不太相同的內涵。在嵌入式開發中,API更多是指在頭文件裡的函式,而在網絡開發上API指的就是Http伺服器。但如果你太過鑽牛角尖在「API是什麼 ?」這個問題上,就很容易導致不必要的煩惱。

 

什麼是引擎 ?


基於這些前提下,「Engine」 「引擎」 這個詞就也被會被借用到程式設計上,「引擎」這個詞並不只是用在遊戲上,在不同領域的程式設計都有被借用,用在遊戲上的便是「Game Engine」,用在生成報告的便是「Report Engine」,用在渲染的便是「Rendering Engine」。

    如同一台車輛,引擎是一台車最重要的「零件」,注意「零件」是關鍵字。一台車輛沒了鈑金一樣也能跑;一台車沒了安全氣囊也能前進;甚至是沒了輪子車輛也能運作,儘管難以造成推進力。但如果沒了引擎,那連發動都無法,可能連一台車都算不上。程式設計上的引擎也是類似的概念,引擎這個詞彙的便是指多個為了實現某個目的、來自不同範疇的、必須的、最為核心的「零件」,或者說程式碼。

請留意遊戲引擎是組成遊戲的零件,不是製作遊戲的編輯器。

 

從起跑線開始的遊戲開發


在編程圈裡有一個開發模式,叫做From Scratch,也就是從起跑線、從起點開始進行開發。換句話說就是重新發明一次輪子,但「重新發明一次輪子」在編程上並不是沒有任何意義,對開發者來說,From Scratch去開發是理解整個底層到高層的運作邏輯最好且最快的方式。當然我們不可能真的在一篇文章內從最最底層開始重新開發一個遊戲引擎,但為了更好的理解什麼是遊戲引擎,我們仍然可以簡單的go through一次起跑線開始的遊戲開發。

 
    上圖是一個由底層到頂層遊戲開發的各個部件,最下方最接近機器硬件的被叫做最底層,最上方的是最頂層,也就是常聽見的 Low Level 和 High Level Development。從最下方開始是與硬體連接的驅動器(Driver),而這也是一個程式的最基礎,滑鼠、鍵盤如何發送訊號,電腦如何接收訊號 ; 螢幕如何接收訊號,而這一部分通常會被叫做嵌入式編程(Embedded Programming)。當我們有了驅動器之後,再上一層就是作業系統。基於不同的作業系統我們需要開發一個通用於各個平台的開發工具(SDK),而這個一系列的開發工具需要包括物理運算的API、渲染運算的API等等。當我們也有了開發工具之後,是時候寫我們遊戲的核心系統,例如設計記憶體池等的記憶體管理方式、設計遊戲進行時的Game Loop,設計管理資源的系統,物理運算的高階API,渲染運算的高階API。


到最後,基於這個核心系統下,我們便可以開始「設計」我們的遊戲,到這裡基本上就是一般開發者會比較常接觸的內容,設計素材、設計關卡、設計物件的行為等等,而這一部分就是大多數開發者用所謂的「遊戲引擎」在進行的開發。當這一部分完成了,一個遊戲也正式
開發完成。

上文所寫的正是一個簡單版From Scratch開發過程,這個過程可以說是十分繁瑣,對於一個商業產品而言,每一次都從底層開發是不現實的。因此,有一些開發者把一部分底層可重覆使用的代碼(圖中的OS到Core System部分)獨立出來開發,成為一個獨立的產品,使用者再以API的形式與之互動,而那就是遊戲引擎。
所以遊戲引擎不是編輯器,遊戲引擎是遊戲的一個核心零件,是一段一段被編釋進遊戲裡的程式碼,那個編輯器只是核心零件的安裝說明書罷了。

 

 

 

Published by