<input id="ohw05"></input>
  • <table id="ohw05"><menu id="ohw05"></menu></table>
  • <var id="ohw05"></var>
  • <code id="ohw05"><cite id="ohw05"></cite></code>
    <label id="ohw05"></label>
    <var id="ohw05"></var>
  • 剖析虛幻渲染體系(14)- 延展篇:現代渲染引擎演變史Part 1(萌芽期)

     

     

    14.1 本篇概述

    古人有語:以史為鑒,可以知興替

    歷史如此,技術亦然。通過研究現代引擎的演變歷史,可以更加系統、詳細地了解引擎的技術內幕,從而掌握底層原理,挖掘規律,預判技術或行業的未來。恰好這段時間筆者通讀了1000多篇各類論文和文獻,抽取了其中的數百篇文獻,總結歸納成此篇文章,以饗同行。

    14.1.1 游戲引擎簡介

    本節將闡述游戲引擎的定義、功能、模塊以及基本框架。

    游戲往往有很多共同的功能,將這些功能創建抽象出通用功能的框架,即是游戲引擎(Game Engine)。更準確地說,游戲引擎是一系列模塊和接口,使游戲開發團隊可以專注于產品游戲內容,而不必關注技術內容。

    游戲引擎按照完整性看分為一體式和模塊化兩種類型。一體式是GameMaker、RPGMaker之類的引擎,模塊化的引擎是指UE、Unity之類的引擎。本篇將著重闡述模塊化類型的游戲引擎。

    游戲引擎是通用游戲所依賴的功能或模塊。游戲引擎是一個框架,由一組不同的工具、實用程序和接口構成游戲的各種任務的詳細信息。簡而言之,游戲引擎可定義為:可擴展的軟件,無需重大修改即可用作許多不同游戲的基礎。

    現代游戲引擎架構的常見模塊。

    有許多計算機游戲類型,主要有第一人稱射擊游戲 (FPS)、實時策略 (RTS) 和角色扮演游戲 (RPG)。所有類型都包含單人游戲(其中使用人工智能模擬其他玩家)或多人游戲(其中幾個玩家可以通過計算機網絡在同一個虛擬世界中互動),或兩者兼而有之。而不同的游戲引擎更擅長某些類型的游戲創作。比如Unreal Engine更適合室外的FPS,Unity更適合輕量級的移動端游戲,等等。

    大多數現代電腦游戲可以分為三個部分:游戲引擎、游戲邏輯和游戲藝術。游戲引擎是在計算機上運行的主要可執行文件。它提供了一個運行游戲邏輯的環境,以及基本的數學、圖形、音頻、用戶輸入和網絡功能。游戲邏輯可以采用腳本、虛擬機字節碼或庫(例如 DLL)的形式。游戲邏輯的任務是控制游戲玩法,并使用引擎適當地展示游戲藝術。游戲藝術包括圖片(游戲用語中的紋理)、地圖(虛擬世界的布局)、模型(居住在世界上的事物的 3D 表示,例如玩家、武器或花盆)和聲音。

    游戲和游戲引擎的關系。

    游戲、游戲引擎、計算機的抽象分層。

    游戲引擎內的常見分層結構和模塊。

    現代游戲引擎的模塊詳情。

    通過改變游戲邏輯和藝術,可以使用游戲引擎來創建許多不同的計算機游戲。在某些情況下,如果源代碼可用(如Quake 2),則可以修改游戲引擎本身。

    總之,游戲引擎為游戲創作團隊提供游戲開發的方方面面,使得游戲開發者需要更少的編程技能,可以快速、高效地創建出具有專業品質的虛擬內容。游戲引擎的尺寸、模塊化和可移植性的增加,以及與之相關的改進工具被認為是從第一款游戲到今天發展的總體趨勢。

    使用游戲引擎的目的有幾個:

    • 靈活性。可以做任何原生 API 讓我們做的事情,沒有刪減功能。
    • 生產率。比原生 API 更易于使用,更少的代碼,更少的精神負擔。
    • 性能。與手寫原生代碼類似的CPU幀時間。
    • 簡單。保持接口盡可能少而精。


    主流商業游戲引擎的部分特性。

    利用游戲引擎創作游戲等產品,擁有的好處是:

    • 更少的代碼
    • 更高的生產力 = 更少的時間!
    • 可用性(易于使用)
    • 與設計程序的兼容性(集成)
    • 更多工具,更多選擇
    • 插件和庫
    • 跨平臺

    當然游戲引擎并非萬能,也存在諸多限制,比如:制作與引擎預期不同的類型可能很困難,讓引擎做任何意想不到的事情可能很困難,游戲開發者對引擎的弱點會限制游戲的品質和效率。

    14.1.2 游戲引擎模塊

    游戲引擎是游戲或模擬游戲的核心軟件,用于描述用于開發游戲的一組代碼。在屏幕上看到并在游戲世界或模擬環境中與之交互的一切 均由游戲引擎提供支持。它允許抽象并執行普通游戲的細節或模擬相關的任務(例如渲染、物理、輸入),使開發者可以專注于制作他們的游戲的各個方面模擬特性。

    典型的游戲引擎組件和類型圖。

    游戲引擎的設計側重于靈活性,允許對其功能進行簡單擴展,可以很容易地修改以適應受某些因素(如內存等)限制的平臺。引擎分為兩個不同的部分,稱為框架和管理器。框架包含游戲中重復的部分,意味著它們會有多個實例,還包含與主游戲循環的執行有關的項目。管理者是游戲邏輯所依賴的單例。下圖說明了組成引擎的不同部分:

    游戲引擎最基礎的模塊必然包含時間更新、場景管理、渲染(圖形、繪制)、輸入事件等等。

    擁有以上基礎模塊之后,高級一些的游戲引擎,還擁有更多復雜的模塊,諸如攝像機、屏幕管理、網絡、音頻、物理、動畫、模型等等。

    應用程序維護的屏幕映射表,屏幕可以使用事件或將它們傳遞到不同的屏幕。

    渲染模塊是引擎的核心功能,一直以來是游戲引擎的重中之重,也是行業從業人員重點攻克的陣地。一個游戲引擎的成功與否,渲染模塊占據非常重要的地位。渲染模塊最簡單的功能如設置相機、繪制形狀、設置形狀的材質屬性、繪圖文本,從而生成標準圖形API接口,通過操作系統或(和)驅動程序像GPU發送并執行繪制指令。

    高級的游戲引擎往往還有高層的游戲通用模塊,如玩家控制、插件體系、編輯器、自動化工具、資產管理等等。游戲引擎還擔負著跨平臺、圖形API、硬件差異等抽象和處理工作。現代游戲引擎往往包含著更加復雜、多樣、全面的模塊和工具鏈,可將它們分為低層級、中層級、高層級模塊。具體如下:

    • 低層級模塊

      • 數據結構
        • 數組、鏈表、樹、圖、哈希表
      • 算法
        • 排序、動態規劃、并行循環
      • 數學
        • 向量、矩陣、四元數
        • 幾何計算
        • 隨機數
        • 其它數學模塊
      • 內存管理
        • 游戲引擎通常使用自定義內存管理
        • 必須避免碎片化
        • 分層內存管理
        • 尋址
        • 垃圾回收
        • 顯卡內存管理
      • 資源和文件IO
        • 快速加載
        • 尋址
        • 解析
        • 文件格式
        • XML
        • 壓縮
        • 資源打包
      • 輸入設備
        • 控制板、操縱桿
        • 鍵盤、鼠標
        • 特殊硬件(觸覺,6-DOF)
        • 力反饋
        • 麥克風
        • 相機
        • 配置
        • 按鈕映射
        • 校準
      • UI
        • 基礎控件
        • 事件管理
        • UI動畫
      • 性能監測
        • 時間是關鍵資源
        • 各種硬件,每個都有自己的時序和性能特征:CPU、圖形、音頻、IO
        • 存在許多復雜的分析器
        • 游戲內預算和警告游戲預算和警告
        • 游戲內繪圖 游戲繪圖
        • 用于全面分析的調試工具
    • 中層級模塊

      • 渲染
        • 詳見圖形子系統
      • 音頻
        • 3D 空間化:平移、多普勒、杜比環繞、HRTF(與頭部相關的傳遞函數)
        • 管理聲音優先級(聲音)
        • 混響,效果
        • MIDI
        • 音樂
        • 動態音樂
        • 流式傳輸 CD / DVD(多個流)
        • 語音
      • 文本
      • 碰撞檢測
      • 物理學
      • 腳本
      • 聯網
      • 角色動畫
      • 電影播放
    • 高層級系統

      • 場景管理
      • 用戶控制
      • 相機
      • AI(人工智能)
      • 游戲邏輯
      • 游戲流程
      • 燈光、視覺效果
      • 平視顯示器
      • 前端(用戶界面)
    • 圖形子系統

      • 渲染
        • 在硬件之上分層
        • 常用 API:OpenGL、Direct3D、Vulkan、Metal
        • 渲染多邊形網格(顯示列表)
        • 照明
          • 漫反射、鏡面反射、AO、GI、IBL、PBR
        • 圖形狀態
        • 矩陣和視圖轉換
        • 著色器
        • 特殊材質
          • 皮膚、頭發、眼球、二次元
      • 場景管理
        • 場景圖
        • 加速結構:KD樹、四叉樹、八叉樹、Portal、BVH等
        • 貼花
        • AI
        • 碰撞
      • 剔除
      • LOD
      • 地形渲染
      • 角色換膚
      • 粒子引擎
      • 效果(天空、水、植被、霧)
    • 工具

      • 代碼開發工具

        • 編譯器(Visual C++、SN Systems、CodeWarrior、GNU)
        • 調試器
        • 探查器
        • 編輯
        • 修訂控制(CVS、SourceSafe、SVN)
        • 集成開發環境 (IDE)
        • C++、匯編、腳本語言
        • 圖形語言:像素和頂點著色器……
        • 設計分析工具
        • 文件、標準
      • 中間件

        • 渲染:RenderWare、NDL、Intrinsic、OGRE、OpenSceneGraph
        • 物理引擎:ODE、Havok、PhysX、牛頓
        • 數學引擎
        • XNA、Bink、FMOD、ScaleForm
      • 藝術制作工具

        • 3D 建模和動畫(Maya、3D Studio)
        • 導出導出模塊模塊
        • 資產管理(AlienBrain)
        • 繪畫(2D 和 3D)(Photoshop、Z-Brush、DeepPaint)
        • 掃描(2D、3D)
        • 動作捕捉
        • 游戲內工具和編輯器
      • 音頻工具

        • 錄音
        • 作曲(ProTools)
        • 音效(原因)
        • 空間音頻配置工具
        • 游戲內工具
      • 游戲設計工具

        • 游戲內工具
        • 關卡布局
        • 原型制作工具(Director、Flash)
        • 設計工具
        • 圖形用戶界面工具
          • CEGUI、NGUI、UMG

        開源渲染引擎OGRE集成的CEGUI編輯器一覽。

    對于交互,游戲或模擬中的交互游戲或模擬中的交互非常重要,是整體用戶滿意度的最重要因素。每個游戲/模擬都有自己的要求,具體取決于類型、支持的控件、交互的響應時間、交互響應的真實程度等。每個應用程序的目標群體在很大程度上定義了交互選項。

    只要有可能,用戶自定義和修改交互參數的能力是必不可少的、至關重要的,例如鼠標移動速度、鼠標移動速度反轉、上下軸反轉、多上下軸、多模態控制模態控制等。常見的一種游戲執行流程包含處理窗口消息、調度器執行、分發更改、檢測執行狀態,如下圖所示:

    通用的場景和物體的關系如下圖所示,每個系統包含一個或多個場景,每個場景包含一個或多個物體:

    游戲引擎通常由工具套件和運行時組件組成,下圖顯示了構成典型3D游戲引擎的所有主要運行時組件。像所有軟件系統一樣,游戲引擎是分層構建的,通常上層依賴于下層,反之則不然。當較低層依賴較高層時,會引發循環依賴。在任何軟件系統中都應避免依賴循環,因為它們會導致系統之間出現不良耦合,使軟件無法測試,并抑制代碼重用,對于游戲引擎這樣的大型系統尤其如此。

    游戲引擎中常見模塊的細節和特性。通常采用了分層架構,上層依賴下層,反之不然,否則會引起不良的循環依賴。(圖摘自《Game Engine Architecture Third Edition》)

    游戲引擎的工具套件存在多種創作方式,部分工具可能是獨立的軟件,部分工具可能構建在運行時引擎使用的一些較低層之上,還有一些工具可能內置在游戲本身中。例如,基于Quake和Unreal的游戲都擁有一個游戲內控制臺,允許開發人員在運行游戲時輸入調試和配置命令。


    上:獨立的工具架構;下:共享于游戲之間的框架式工具。

    游戲引擎分層示意圖。

    平臺相關的模塊。

    核心系統相關的模塊。

    游戲邏輯相關的模塊。

    游戲引擎中涉及的各類管理器如下圖所示:

    如何識別游戲引擎的通用部分?看待這個問題的一種方法是專注于將游戲引擎定義為除內容之外的所有內容,每個游戲引擎的通用部分將包括:

    • 主循環(或替代結構)
    • 處理游戲數據文件或鏈接到用代碼編寫的游戲數據的模塊
    • 處理游戲邏輯的模塊,可以但不是必須由數據文件指定
    • 從播放器獲取輸入的模塊
    • 將輸出呈現給播放器的模塊
    • 輔助模塊,例如網絡和菜單處理

    14.1.3 游戲引擎列表

    目前市面上的游戲引擎數量達到驚人的上百個,有些是當前風靡全球的商業引擎,有些是研制出很多3A級游戲的游戲公司內部引擎,有些是用于學習或研究的開源渲染器,有些則是曾經流行但現在已經淡出歷史舞臺的引擎。下面將闡述部分常見的游戲引擎。

    14.1.3.1 Unreal Engine

    虛幻引擎(Unreal Engine,UE)是一款集圖形渲染和開發套件的商業引擎,在歷經數十年的發展和沉淀,于百擎大戰中脫穎而出,成為引領實時渲染領域的全球性的通用商業引擎,廣泛應用于游戲、設計、仿真、影視、教育、醫學等行業。它出自游戲公司Epic Games,最初由Tim Sweeney負責,從上世紀90年代中期就開始,已經經歷了20多年,歷經數個大版本迭代。

    Unreal Engine 2是一個完整的游戲開發框架,針對當今主流PC、微軟的Xbox游戲機和索尼的PlayStation 2。Unreal Engine 2X是Epic自制游戲Unreal Championship 2: The Liandri Conflict中令人瞠目結舌的視覺效果背后的高度優化引擎。

    Unreal Engine 3是一個完整的游戲開發框架,適用于下一代游戲機和配備DirectX9的PC,提供頂級游戲開發者所需的大量核心技術、內容創建工具和支持基礎設施。雖然Unreal Engine 3對Mod制作者開放程度很高,但使用UE3發布和銷售游戲的能力僅限于引擎許可。在2009年11月,Epic發布了一個免費版本的UE3 SDK,稱為Unreal Development Kit (UDK),可供公眾使用。

    Unreal Engine 4相比之前版本有了很大的改進,使之成為一款風靡全球的游戲開發引擎。虛幻引擎是一套完整的構建游戲、模擬和可視化的集成工具。其特性包含但不限于實時逼真渲染、可視化腳本、實時光線追蹤、完善的游戲框架、專業動畫和過場、完善的工具鏈等等。

    Unreal Engine 5于2020年5月13日發布預覽視頻,支持所有現有系統,包括次時代游戲主機PlayStation 5和Xbox Series X/S。該引擎的研發工作在發布前約兩年就已開始,且在2021年中期發布了Early Access版本的源碼,并計劃于2022年全面推出。Unreal Engine 5采用了兩大核心技術:

    • Nanite:允許將高細節攝影源材料導入游戲的先進技術,可用于處理游戲場景中復雜的幾何體;
    • Lumen:用于解決游戲的全局光照細節,并且不依賴于硬件的光線追蹤。



    從上到下依次是Unreal Engine 1、Unreal Engine 3、Unreal Engine 5的編輯器界面。

    早期的Unreal的基于光照圖的光照效果。

    Unreal Engine作為行業頂級的通用商業游戲引擎,被游戲行業廣泛使用,并研制出了許多知名、畫面精良的游戲。



    用Unreal Engine研發出的游戲截圖。從上到下依次是UE3的Batman: Arkham City、UE4的最終幻想7重制版、UE5的黑神話悟空。

    有了UE5的Nanite、Lumen等技術的加持,使得實時互動游戲朝著影視級的畫質發展,Epic官方放出的黑客帝國演示demo便是最好的例證(下圖)。

    Epic用UE5研制的黑客帝國互動Demo截圖,畫質直逼電影,讓人無法區分游戲和電影的界限。

    除了游戲行業,虛幻引擎還被廣泛應用于影視、仿真、設計、廣電、科學可視化等領域,并逐漸完善了相配套的工具鏈和生態社區。

    UE用于演習和模擬器中以進行培訓。

    14.1.3.2 Unity

    Unity由Unity Technologies公司研發維護,是一個具有功能強大的編輯器的跨平臺游戲引擎,也是最受歡迎的商業引擎之一。在項目中,開發人員可以控制向移動設備、Web瀏覽器、桌面和控制臺的交付。它的功能非常豐富,使用Javascript或C#編寫腳本,存在大型社區支持,非常適合跨平臺開發。

    Unity的第一個版本 (1.0.0)于2005年6月發布,目標是為業余游戲開發者創建一個價格合理的游戲引擎,并為業余游戲開發者提供專業工具,同時“使游戲開發民主化”行業。這三者的靈感來自Apple的Final Cut Pro產品的簡單工作流程、簡單的資產管道和拖放界面。最初發布時,Unity僅適用于Mac OS X,開發人員只能將他們的作品部署到少數平臺。當前版本可以支持Windows 和 Mac OS X等至少十幾個目標平臺。

    Unity早期版本(版本 0.2)的屏幕截圖。

    早期Unity游戲Gooball截圖(2005)。

    14.1.3.3 CryEngine

    CryEngine系列引擎由德國游戲開發商Crytek設計的游戲引擎,已被用在CryTek的所有游戲中。初始版本在孤島驚魂中使用,并繼續更新以支持他們的游戲的新控制臺和硬件。

    CryEngine自2004年發布了1代引擎,到目前的版本V,經歷了20多年的發展迭代了數個大版本。Ubisoft維護了一個內部的、經過大量修改的原始孤島驚魂的CryEngine版本,稱為Dunia引擎,用于他們后來的孤島驚魂系列迭代。

    CryEngine和其孿生引擎的發展歷程。

    CryEngine完整的家族樹及游戲列表。

    CryEngine 1最早于2004年和Far Cry的技術演示一同發布,支持Shader Model 3.0、HDR照明及其它圖形特性。游戲代表作有孤島驚魂、永恒之塔等。

    CryEngine的場景和地形編輯器(2004)。

    CryEngine的動態光照效果(2004)。

    CryEngine的水體、船、人物相互交互的渲染效果和編輯器(2004)。

    Far Cry游戲截圖。

    CryEngine 2于2007年發布,支持HDR照明、實時環境貼圖、體積云、動態水體(水面和水下)、景深、運動模糊、動態軟陰影、動捕臉部動畫、次表面散射、可互動和破壞的環境、可交互植被、繩索物理等特性。代表作有Crysis、Crysis Warhead等。


    Crysis游戲截圖。

    CryEngine 3在2009年發布,相比上一代引擎,引擎支持 DirectX 9、10 和11的開發,新增了許多先進的圖形、物理和動畫技術以及許多游戲增強功能,比如:實時間接照明的級聯光傳播體積、軟粒子、多核并發、延遲光照、自然光和動態軟陰影、霧效果(體積、分層和視距)、SSAO、全能著色器、人眼適應、HDR照明、運動模糊、DOF、次表面散射、高質量水體、動態體積光束和光軸效果、流環境、多核物理引擎、交互和破壞環境、高速紋理渲染等等。代表作有孤島危機 2等。

    CryEngine3的渲染效果。

    CryEngine3研制的射擊游戲Nexuiz。

    CryEngine (3.6–4)于2013年發布,Crytek將CryEngine(從版本 3.6.0 開始)更名為“CryEngine”,并宣布下一個CryEngine將不會以版本號進行宣傳,原因是聲稱這個新引擎與以前的CryEngine版本幾乎沒有相似之處。

    CryEngine渲染出的大片森林。

    CryEngine V(5)在2016年3月發布,CryEngine 5.4在2017年9月發布,添加Vulkan API渲染器作為測試版、物理集成和其它功能,包括新的C#模板、資產系統更新和新的抗鋸齒技術。在渲染方面,CryEngine V支持以下特性:

    • 區域光源
    • 基于物理的渲染(PBR)
    • 曲面細分
    • 高效的抗鋸齒
    • 實時局部反射
    • 基于體素的全局光照(SVOGI)
    • 屏幕空間方向遮擋(SSDO)
    • 基于圖形的光照(IBL)
    • 體積霧陰影
    • 支持DirectX 12
    • 實時動態水體焦散
    • 3D HDR鏡頭光暈
    • 運動模糊和景深
    • 實時植被
    • 逐物體陰影圖。
    • HDR膠片色調映射
    • 粒子特效系統
    • 平行視差映射

    CryEngine 5.3編輯器。

    CryEngine V沙盒編輯器。

    CryEngine V的渲染效果圖。

    14.1.3.4 Doom / Quake / ID Tech

    Quake家族引擎用于創建許多游戲,擁有延伸到榮譽勛章等現代游戲的血統,并且Quake和Quake II引擎源代碼免費提供。

    在2004前后,Quake 3使用標準的FPS游戲控制系統:鼠標外觀和鍵盤,四處移動鼠標會改變玩家的視線方向,鼠標按鈕通常用于向前行走和射擊,鍵盤上的各種按鍵用于蹲伏、跳躍、后退、掃射和切換武器,可以通過稱為鍵綁定的過程將鍵重新映射到不同的游戲內功能。Quake 3是一款面向網絡的游戲,使用客戶端-服務器(CS)通信模型。

    Doom、Quake、Unreal等引擎有個共同特點,那就是擅長FPS類型的游戲。下面是詳細的FPS游戲及引擎的發展歷程圖:

    其中ID Tech 3支持摒棄了軟光柵渲染,需要一個兼容OpenGL的圖形加速器運行。引擎的圖形概念緊密圍繞“著色器”(如今的材質)系統,其中許多表面的外觀在文本文件中定義,稱為“著色器腳本”。此外還支持基于樣條的曲面、曲線頂點動畫、基于子模型的動畫分離、體積霧、鏡像、入口、動態陰影和基于波形的頂點擾動。

    14.1.3.5 OGRE

    OGRE是一款開源的較為成熟的多平臺3D圖形引擎,支持OpenGL和DirectX渲染,在LGPL許可下用C和C++編寫。 它具有基于OO的設計,并支持可加載的代碼模塊。它還提供了分層場景圖、基本物理函數,并內置了2D GUI系統,支持常用小部件和TrueType字體。在2000年時代,它擁有龐大而活躍的開發人員和用戶支持社區。 然而,它不是游戲引擎,只處理圖形渲染,故而不支持網絡或音頻,需要引入第三方庫。

    用ORGE制作的游戲代表作有Runic Games的火炬之光(Torchlight),Torchlight是角色扮演游戲,類似暗黑破壞神的風格和玩法,于2010 年游戲開發者選擇獎最佳處女作獎,可通過數字分發在Windows和Mac上使用。

    用ORGE研發的單機暗黑類游戲Torchlight的游戲截圖。

    Torchlight剛發布之時,筆者恰好入職國內某一線游戲公司,被Torchlight炫酷的畫面、技能效果和別具一格的玩法深深吸引,那時還沒有996,每天一下班就有大把時光沉迷于探索它的暗黑魔法世界。

    在2000年時代,國內涌現了很多游戲公司和團隊基于ORGE做魔改和二次開發的自研引擎,其中最為成功的案例便是暢游的天龍八部,它是一款改編自金庸古風武俠小說的網絡游戲,曾經風靡一時,至今尚在運營。基于OGRE二次開發的引擎或開源庫有很多,其中就包含Ogre Golf。后期的ORGE發展的功能有:可擴展框架、多平臺、場景管理器、資源管理器、材質、網格、動畫、渲染器、特效、著色器、插件等。

    14.1.3.6 Gamebryo

    Gamebryo由Emergent Game Technologies研發維護,是一款跨平臺的3D游戲引擎,游戲代表作有Fallout 3 (Bethesda)、Civilization Revolution (Firaxis)、Warhammer Online (EA Mythic)等。

    Gamebryo引擎以前稱為NetImmerse。NetImmerse的開發以幾個設計目標為指導,其中最重要的是速度,導致研發者在整個引擎中使用了簡單的技術,并大量基于場景圖數據結構,允許多種性能增強技術,例如剔除對玩家來說是不可見的游戲對象。

    其它設計目標是提供與標準圖形和音頻接口的兼容性,并提供高級編程接口。引擎研發者聲稱目標已經實現,并分別指出創建引擎的一個發現是“高級編程接口不需要犧牲性能”。引擎提供高級接口很重要,允許開發人員降低開發成本,并且需要針對引擎進行優化不同類型的游戲。

    Gamebryo Lightspeed有著較廣泛的游戲作品,提供快速的應用程序擴展框架,另外解耦的架構設計使得游戲團隊可以方便地擴展。Gamebryo支持處理聲音、圖形、物理和多人游戲的各種技術和游戲玩法,它的視覺保真度高,曾被用于制作具有廣闊景觀的游戲以及復雜的面部細節。此外,它還被用于開發美國政府和軍隊項目,以及消防和手術模擬。

    14.1.3.7 BigWorld

    BigWorld(也稱為 Wargaming Sydney)是一家澳大利亞公司,由John De Margheriti于2002年成立,該公司開發和許可用于創建大型多人在線游戲 (MMO) 和虛擬世界的中間件開發工具套件。它是第一家為MMO市場開發此類中間件平臺的公司。2007年,BigWorld被英國的Develop雜志公認為行業領導者。2012年8月7日,Wargaming以4500萬美元收購了BigWorld中間件公司。

    BigWorld Technology提供了游戲開發者構建MMO和在線游戲所需的底層軟件架構。3D客戶端技術專為Windows PC和瀏覽器構建,可通過網絡API在 iOS、Xbox 360和PlayStation 3上使用。 后端服務器解決方案在Linux下實現,具有Python API腳本環境。該工具套件包括內容創建工具、服務器監控工具和支持。BigWorld Technology還集成了各種第三方插件,例如Umbra(遮擋剔除)、Scaleform(用戶界面創建)、Speedtree(樹葉)和 Vivox(VOIP)。

    游戲代表作主要有:World of Tanks系列、天下系列等。

    14.1.3.8 Torque3D

    早期的Torque3D引擎有幾個版本,具體描述如下:

    • Torque Game Engine 1.0:以及 TGE 1.5 的所有功能,它具有 atlas 地形生成編輯器、Torque GFX 圖形層、自定義紋理材料、現代場景圖和批處理渲染引擎。
    • Torque Game Engine 1.4:這個舊版本的 Torque 仍然具有 3D 工具集、地形引擎、網絡引擎和其它功能。基于用于部落 2(Tribes 2)的技術。
    • Torque Game Engine 1.5:1.4.2 的重大升級,具有集成的 Torque 照明套件、ShowTool Pro、附加藝術資產等等。

    是2010年之前的一款較流行的游戲引擎,后逐漸衰落,淡出人們的視野。

    Torque引擎河流編輯器。

    Torque地形編輯器。

    Torque引擎的渲染效果。

    14.1.3.9 Source Engine

    Source Engine是由Valve Software開發的屢獲殊榮的3D游戲引擎,最初在1994年被發行出來,被認為是市場上最先進的游戲引擎之一,支持諸如使用Havok引擎的逼真模擬物理、DirectX 9.0支持(包括高動態范圍照明、骨骼動畫、聲音系統和許多其它功能)等功能。它是成功的知名游戲《半條命 2》所依賴的引擎。

    源引擎附帶可用于構建游戲模組的Source SDK,該SDK對半條命2游戲的所有者免費提供,并提供了對Valve自己用來創建半條命2系列游戲、失敗之日源、反恐精英源和即將推出的游戲(包括傳送門和軍團要塞 2)的工具的訪問權限。它也被包括Ritual the creators在內的許多獨立開發者使用。

    2010前后的Source引擎應用了快速、可靠和靈活的技術,使用以下許多功能呈現計算或渲染密集型游戲:

    • Direct3D(在Windows 95及更高版本、Xbox 和 Xbox 360 上渲染)。
    • OpenGL(在Mac OS X和PS3上渲染)。
    • HDR(高動態范圍),HDR 僅在《半條命》的《失落海岸》中引入,而沒有在《半條命 2》單人游戲中引入。
    • 具有自動生成唇形同步功能的面部動畫系統。
    • 想要修改游戲的人的源代碼。
    • 混合骨骼動畫系統。
    • 一個模型查看器,用于查看您的角色在不同著色器中的樣子。
    • 放置凹凸貼圖、紋理等的材質系統。

    Source引擎的架構和特性。

    使用 Source引擎的Vindictus游戲截圖。

    14.1.3.10 Frostbite

    Frostbite是EA Digital Illusions CE(DICE)開發的一款內部游戲引擎,專為在Windows、PS系列 、Xbox 系列上的跨平臺使用而設計X/S系列。該游戲引擎最初用于戰地游戲系列,但后來擴展到其它第一人稱射擊視頻游戲和各種其它類型。Frostbite一直是由Electronic Arts發行的游戲所獨有的,迄今為止已經發布了3個大版本,其代表作有戰地系列、FIFA系列、極品飛車系列、植物大戰僵尸系列、星際大戰系列等等游戲。



    用Frostbite研制的部分游戲截圖。從上到下依次是:Need for Speed Heat、Battlefield 2042、Star Wars: Squadrons。

    Frostbite雖然是DICE的內部引擎,不對外發行和授權,但因為Frostbite的研發成員活躍于Siggraph、GDC等國際技術峰會,常在峰會上分享最新的渲染技術和研究成果,而享譽盛名于游戲行業。Frostbite公開分享的技術文章列表可參見:EA Tech Blog

    14.1.3.11 Anvil

    Ubisoft Anvil(直到2009年稱為Scimitar,直到2020年稱為AnvilNext)是由Ubisoft Montreal創建并用于2007年游戲刺客信條的游戲引擎,包含Scimitar、Anvil、AnvilNext、AnvilNext2.0、Ubisoft Anvil等分支。引擎用于Microsoft Windows、Nintendo Switch、PlayStation 3、PlayStation 4、PlayStation 5、PlayStation Vita、Wii U、Xbox 360、Xbox One、Xbox Series X/S 和 Stadia等平臺。專為主機游戲刺客信條打造,后來被用于刺客信條系列、湯姆克蘭西的幽靈行動等游戲中。

    Ubisoft Anvil圖標。

    Anvil引擎使用Autodesk的HumanIK中間件在運行時正確定位角色的手和腳以進行攀爬和推動動畫。添加的功能包括完整的晝夜循環、增強的繪制距離、與孤島驚魂 2 相同的植被技術、改進的照明、反射和特殊效果、新的布料系統以及新的AI和NPC導航系統。

    AnvilNext增加了對新天氣系統的支持,該系統允許特定的天氣設置以及在刺客信條IV中看到的自動循環模式。其次,渲染器被重寫以提高效率并支持額外的后處理技術,最多可以實時渲染3000個不可播放的角色。最后,AnvilNext 添加了來自Far Cry 4的技術,以支持更加動態的沙盒環境和新的水技術,游戲世界可能會隨著時間的推移而變化,具體取決于玩家的行動和進展。更重要的是,從刺客信條Unity 開始的AnvilNext能夠以靈活和自動的方式生成結構,同時遵循特定的設計規則和模板,從而減少藝術家和設計師創建錯綜復雜的城市環境所需的時間和人力。AnvilNext還為不可玩角色提供了改進的AI。

    渲染方面,該引擎支持預烘焙的全局照明、反射映射、體積霧、動態天氣和動態樹葉等等,還有基于物理的渲染 (PBR) ,使材質、對象和表面能夠更逼真地查看和反應照明、陰影和陰影。此外,通過添加體積技術,全局照明系統現在更加逼真,以物理為導向的對象反應更加逼真,并且布料在主角、環境和其他角色上的表現更加逼真。世界現在支持更大的陸地、更多的物體、更大的建筑物、無需加載屏幕即可訪問的建筑物內部,以及許多其他增強視覺保真度、沉浸感和游戲玩法的附加功能。

    代表作有刺客信條系列、For Honor、Tom Clancy's Rainbow系列等等。

    Assassin's Creed Valhalla的打斗畫面截圖。

    14.1.3.12 Destiny Engine

    Destiny引擎是游戲公司Bungie研發的游戲引擎,用于開發自家的Destiny系列游戲。

    2013年,《命運》的大部分基礎工作已經完成,包括傳說、游戲引擎以及許多環境和任務。

    Destiny1代游戲采用了一種新的游戲引擎,稱為Tiger Engine,它基于大多數Halo游戲所使用的引擎,允許全局光照和實時動態光照同時運行。此外,Bungie的目標是Destiny將在Xbox One和PlayStation 4上以1080p原生渲染圖形。Bungie的“漏斗”技術創新是Halo配對系統的支柱,允許更好的玩家配對,以便在合作或競爭的多人模式中創造更自然的體驗。但是,Bungie的開發人員批評新引擎不適合游戲的在線性質,引擎的資源密集型特性使得即使是對地圖的微小更改也需要通宵渲染和編譯過程,新地圖和任務的開發是“艱苦的”。

    此外,Destiny的多線程并行技術運用得爐火純青,并引入到場景渲染的各個階段。

    Destiny引擎的場景渲染并行化圖例。

    Destiny 2游戲截圖。

    14.1.3.13 RE Engine

    RE引擎(全稱Reach for the Moon Engine)是由Capcom公司創建的視頻游戲引擎。最初是為《生化危機 7:生化危機》設計的,后來被用于該公司的各種游戲,例如Devil May Cry 5和Monster Hunter Rise。該引擎是Capcom之前的引擎MT Framework的繼承者。

    RE引擎對MT框架進行了各種改進,包括新的抗鋸齒和體積照明功能。該引擎還允許開發人員使用攝影測量來創建更高質量的資產,包括比其前身改進的VR支持,使其能夠達到避免眩暈所需的高幀率,支持使動畫更快的工具,例如模塊化裝配、運動匹配、程序動畫和運動重定向,還具有各種新的物理模擬選項,允許更逼真的碎片。

    代表作包含生化危機系列、怪物獵人、鬼與妖精的復活等。

    Resident Evil Village游戲場景截圖。

    14.1.3.14 RedEngine

    RedEngine由CD Projekt開發和維護,主要針對3A級主機游戲的研發,雖然它的名字鮮有人知,但其研發的游戲卻是鼎鼎有名,游戲代表作有巫師系統、賽博朋克2077等。

    賽博朋克2077游戲截圖。

    14.1.3.15 RAGE

    RAGE全稱Rockstar Advanced Game Engine,是由RAGE Technology Group開發的專有游戲引擎,RAGE Technology Group是 Rockstar Games的Rockstar San Diego工作室的一個部門。自2006年第一款游戲Rockstar Games Presents Table Tennis面向Xbox 360和Wii發布以來,Rockstar Games的內部工作室一直在使用該引擎為游戲機和電腦開發先進的開放世界游戲。

    早期的RAGE特性有角色動畫引擎、物理引擎、處理大型流媒體世界的能力、復雜的 AI 安排、天氣效果、快速的網絡代碼和多種游戲風格,支持DirectX 11和個人計算機的立體3D渲染,以及更強大的繪制距離、紋理過濾以及改進的陰影映射和曲面細分質量。

    隨著2018年Red Dead Redemption 2的發布,RAGE將進一步完善,支持基于物理的渲染、體積云和霧值、預先計算的全局照明以及Windows版本中的Vulkan渲染器,還可以創建先進的 AI 以及增強的游戲物理和動畫,HDR渲染以及深度學習超級采樣 (DLSS) 的支持。

    游戲代表作有荒野大鏢客(Red Dead Redemption)系列、俠盜獵車手(Grand Theft Auto)系列等。

    Red Dead Redemption 2游戲截圖。

    14.1.3.16 PhyreEngine

    PhyreEngine是Sony的一款僅許可免費使用的游戲引擎,兼容PlayStation系列平臺、 Windows(OpenGL、DirectX 11)、Android和iOS。

    PhyreEngine以可安裝包的形式獨家分發給Sony被許可人,其中包括完整的源代碼和Windows工具,根據其自己的靈活使用許可提供,允許任何PlayStation游戲開發商、發行商或工具和中間件公司部分或完全基于創建軟件在任何平臺上的PhyreEngine上。該引擎使用針對 PS3單元寬帶引擎的協同處理器單元 (SPU) 優化的復雜并行處理技術,但可以輕松移植到其它多核架構。

    除了低級PS3 LibGCM庫之外,PhyreEngine還支持OpenGL和Direct3D,提供功能齊全的“游戲模板”作為源代碼,包括對Havok 、PhysX 、Bullet等物理引擎的支持。

    PhyreEngine已被多家游戲工作室采用,并已用 200多個已發布的游戲中。游戲代表作有最終幻想系列、英雄傳說系列等。

    14.1.3.17 Irrlicht

    Irrlicht引擎可以使用 OpenGL、DirectX 或軟件進行渲染,可以在在 Windows 和 Linux 上運行。技術上,Irrlicht使用了分層場景圖進行場景管理,并具有基本的 2D GUI功能。

    Irrlicht比同期的其它引擎要小巧一些,只有一個主要開發人員,但是在當時有一個龐大的愛好者支持社區。 它還提供基本的物理例程,但缺少任何網絡功能。并且,Irrlicht以圖形質量和渲染速度比其它軟件差而聞名,被更容易開發所抵消,通常被視為理想的初學者引擎。



    Irrlicht引擎渲染畫面截圖。

    14.1.3.18 XNA

    Microsoft的XNA Game Studio是一個易于使用且高度可訪問的游戲開發平臺,旨在鼓勵玩家創建自己的游戲并與在線游戲社區分享。

    XNA基于C#和公共語言運行時 (CLR)。主要的開發環境是Visual Studio或其免費對應物Visual Studio Express,其源代碼和游戲資產等所有內容都在Visual Studio中進行管理。借助XNA,開發人員可以為PC、 Xbox 360控制臺創建游戲。通過以基本為零的成本提供出色的工具,微軟出色地為普通人打開了創造新游戲的閘門。

    XNA研發的游戲Barotrauma游戲截圖(2019)。

    14.1.3.19 其它引擎

    在2004前后,FPS 類型中,有三個主要的游戲引擎系列,每個系列都由不同的開發者組成:id Software的Doom 3和Quake 3引擎、Valve Software的Half Life和Half Life 2引擎和Unreal Tournament (UT)和 Epic Games的 Unreal Tournament 2004 (UT2004) 引擎。

    毀滅戰士3、半條命2和UT2004代表了每個開發者的最新一代,并且是當時可用的最佳游戲引擎。Quake 3、UT和Half Life是上一代引擎。應該注意的是,Half Life引擎是基于Quake 和 Quake 2引擎的。

    所有這些引擎都功能齊全,并且基于這些引擎中的每一個都存在一個或多個完整的游戲,與上面的大多數開源引擎形成鮮明對比,后者提供了更多基本功能。開源引擎通常需要與其它庫和工具包結合才能創建可玩的游戲,Quake 3值得特別提及,和其它引擎不同,可以被開發人員進行大量修改。 另一個應該提到的引擎是GarageGames的Torque。它是一種廉價的商用引擎。

    此外,還有Cocos2d系列、Panda 3D、OpenSceneGraph、Delta3D、Blender Game Engine、GameMaker、Godot、bgfx、Unigine、Delta3D等等引擎或渲染器。

    Blender Game Engine編輯器和渲染效果圖。

    下面是另外一些引擎的特點描述:

    下表是部分游戲引擎的說明:

    名稱 公司 許可 代表作 備注
    4A Engine 4A Games 專用 Metro 2033, Metro: Last Light, Metro Exodus
    A-Frame (VR) Google MIT - 開源Entity組件系統WebVR框架
    Alamo Petroglyph Games 專用 星際大戰
    Anvil Ubisoft 專用 刺客信條、湯姆·克蘭西的彩虹六號
    BigWorld BigWorld Technology 專用 坦克世界、天下
    Blender Game Engine Blender Studio GPL-2.0+ Yo Frankie!, Sintel The Game 2D/3D游戲引擎封裝在3D模型中,集成子彈物理庫
    Cocos2d 多個 MIT Geometry Dash 國內是Cocos2d-x/3d引擎
    Creation Engine Bethesda Game Studios 專用 上古卷軸、輻射
    CryEngine CryTek 專用 孤島危機、孤島驚魂
    Dark Engine Glass Studio 專用 Thief: The Dark Project、System Shock 2、 Thief II: The Metal Age 高級 AI 和聲音功能(完全控制聲音傳播)
    Decima Guerrilla Games 專用 死亡擱淺、地平線零黎明、殺戮地帶:暗影墜落、直到黎明、直到黎明:鮮血狂潮
    Dunia Engine Ubisoft 專用 全境封鎖 基于CryEngine
    EGO Codemasters 專用 F1系列 主要用于賽車游戲
    Essence Engine Relic Entertainment 專用 帝國時代4、戰錘、英雄連3
    Fox Engine Konami 專用 實況足球
    Frostbite Ubisoft DICE 專用 戰地、FIFA、星球大戰
    Gamebryo Gamebase 專用 攻殼機動隊:獨立情結、冒險島2
    GameMaker Studio YoYo Games 專用 警察故事、死亡詭計
    Glacier IOI 專用 殺手系列、自由戰士、迷你忍者、凱恩與林奇系列
    Godot Argentina MIT 殘酷小隊、硬編碼、轉儲王國、Keen in Keen Dreams 3.0+通過模塊和GDNative添加了C#腳本和其它語言、PBR和全局照明。
    HeroEngine Simutronics 專用 星球大戰:舊共和國
    id Tech id Software 專用 Doom、Quake、憤怒、德軍總部:新秩序、德軍總部:舊血、內心的邪惡 從Doom和Quake發展而來,早期版本部分開源
    Irrlicht Nikolaus Gebhardt zlib Minetest
    IW Engine Infinity Ward 專用 使命召喚系列 最初基于id Tech 3構建
    Jade Ubisoft 專用 Rayman Mini、Space Junkies、Tom Clancy's Ghost Recon Breakpoint
    Kinetica Sony 專用 戰神
    MonoGame / XNA Microsoft Microsoft Public 幕府將軍的骷髏、泰拉瑞亞、堡壘、塔樓墜落、晶體管、非斯、公理邊緣
    Odyssey Engine BioWare 專用 星球大戰:舊共和國騎士團,星球大戰:舊共和國騎士團II:西斯領主
    OGRE - MIT Torchlight, Kenshi
    OGRE-Next - MIT - OGRE的下一代引擎
    Panda3D - BSD 卡通城在線,加勒比海盜在線
    PhyreEngine Sony 專用、免費 英雄傳說:步入遐想、天空:光之孩子
    Real Virtuality Bohemia GPL-2.0+ ARMA 2、ARMA 3、DayZ
    RedEngine CD Projekt 專用 巫師 2:刺客之王、巫師 3:狂獵、賽博朋克 2077
    RAGE RAGE Tech 專用 荒野大鏢客1和2、俠盜獵車手
    RPG Maker ASCII 專用 女巫之家、Escaped Chasm
    SAGE Westwood Studios、 EA 專用 指環王系列、命令與征服系列
    ShiVa ShiVa Technologies 專用 波斯王子2:陰影與火焰
    Silent Storm engine Nival Interactive 專用 寂靜風暴、守夜人、錘子和鐮刀、日間守夜人 用于回合制戰術游戲
    Source Valve 專用 半條命2、反恐精英:來源、Left 4 Dead、傳送門、軍團要塞2、Dota 2、實驗室、神器、半條命:Alyx 第一款使用Source 2的游戲Dota 2是從原始 Source引擎移植過來的,The Lab的一個迷你游戲Robot Repair使用Source 2引擎,而其余七個使用Unity的引擎。
    TOSHI Blue Tongue 專用 侏羅紀公園:創世紀行動、尼克卡通聯盟、·里維拉歷險記、漫威超級英雄小隊
    Torque3D GarageGames MIT Marble Blast Gold、Tribes 2、Blockland 包括多人網絡代碼、無縫室內外渲染引擎、骨骼動畫、拖放 GUI 創建、內置世界編輯器、類 C 腳本語言
    UbiArt Framework Ubisoft Montpellier 專用 雷曼起源、雷曼傳奇、光之子、勇敢的心:大戰
    Unigine Unigine 專用 Dual Universe 專注于大型開放場景:64位精度坐標,支持地理坐標,圓形地球模型,主要用于企業和專業模擬器。
    Unity Unity Technologies 專用 天刀、原神、最終幻想、王者榮耀、爐石傳說
    Unreal Engine Epic Games 專用 和平精英、黑神話悟空、蝙蝠俠、最終幻想重制版 UE4刪除了UnrealScript

    以上只是其中部分引擎,更詳細的參見:List of game engines

    14.1.4 游戲引擎簡史

    電腦游戲已經走過了漫長的道路,從1962年的太空大戰到在21世紀最大的媒體中占據一席之地,在總收入方面甚至超過了電影行業。從技術上講,計算機游戲就像任何其它計算機程序一樣,由源代碼模塊組成。有人定義的游戲引擎指的是與游戲內容分離的模塊部分:行為或環境。就像汽車的引擎一樣,游戲引擎是游戲的技術核心,游戲的內容就建立在它之上。

    關于游戲引擎的確切含義存在一些混淆,游戲引擎被定義為“不直接指定游戲行為(游戲邏輯)或游戲環境(關卡數據)的模擬代碼模塊的集合”。在引擎的模塊中,游戲世界的輸入處理、輸出(3D、2D 和聲音)以及通用物理和動力學。游戲引擎作為對游戲實際內容沒有影響的模塊,包括輸入、音頻、圖形、動態和事件循環。

    設計和開發軟件組件是一個成本高昂且耗時的過程,因此游戲開發人員通常在經濟上更好地投資于現成的引擎而不是開發自己的引擎,重復使用優質組件也提高了整個產品的整體質量。構建新軟件不可避免地會導致“重新發明輪子”,與以前創建的軟件相比,代碼重復估計高達85%。

    在實踐中,游戲引擎通常會根據特定游戲的內容風格進行調整,但會損害引擎在不同風格游戲中的重用性。大多數引擎都是為在特定平臺上運行特定游戲而設計的,引擎越通用,在特定平臺上運行特定游戲的優化程度就越低。更一般地說,構建可重用的軟件組件所花費的精力是構建一次性組件的三倍。因此,雖然重用現有游戲引擎具有相當的價值,但每個人都構建自己的可重用引擎或每個游戲引擎都可重用(或者甚至與游戲的其它部分分開)則沒有意義。

    在上個世紀80年代之前,由于沒有游戲引擎,每個游戲都需要重復造輪子,必須針對所使用的特定硬件進行構建,多個發行平臺意味著從頭開始重寫游戲,對游戲開發團隊而言,意味著多倍的又重復的工作。

    到了80年代,游戲引擎的前身概念出現,以Pinball Construction Set (Bill Budge)為例,售出超過300000份。

    Pinball Construction Set游戲畫面(1982)。

    Pinball Construction Set定義了一種新型的產品:游戲構建系統,包含IDE、命令行界面、精靈編輯器、模型編輯器、地圖/場景編輯器等。

    到了1990年代,游戲創建系統實際上就是游戲引擎,游戲引擎的術語正式開始出現,由id Software引入,在Wolfenstein 3D(德軍總部 3D)的FPS游戲中展現,引擎名為Fast 3D Engine(實際是2.5D)。

    早期游戲引擎經歷的3個階段。

    id Software隨后發布了正式版游戲引擎Doom和Quake系列。Doom引擎的特性包含紋理映射、非正交墻、光源衰減/光源、可變高度的地板和天花板、環境動畫和變形、調色板轉換、多玩家等。Quake引擎則支持降低3D復雜性以提高速度、預先計算光照和陰影(光照貼圖)、分割地圖以提高速度、快速渲染、渲染順序、硬件3D加速、網絡游戲等。

    初代Quake引擎的最低系統要求和渲染畫面。

    在隨后的1999,Quake引擎在GPL下發布,由此衍生了龐大的Quake引擎家族。(下圖)

    id Tech引擎家族樹。

    Stardock游戲引擎發展歷程。

    從上世紀90年代到如今,游戲引擎已經經歷了30多年的發展,勢頭迅猛,衍生出一代又一代的經典技術和架構,涌現許多通用的引擎和內部引擎,由此幫助了數量眾多的游戲開發團隊和公司,創作出了許許多多耳熟能詳的游戲作品。

    上世紀90年代,游戲引擎還處于混沌期和萌芽期,很多游戲開發團隊尚沒有使用游戲引擎,只對基礎和通用的模塊進行部分抽象,在各個項目之間進行復制。這種模式是處于低級的復用,更別談擴展性、維護性和易用性了。

    沒有游戲引擎的助力,加之游戲技術和硬件的限制,當時的游戲畫面極其粗糙,顏色位深有限,像素嚴重不足,顆粒感十足。(下圖)



    上:Saboteur II(1989);中:Xenon 2(1990);下:Prince of Persia 2(1995)。

    到了上世紀90年代,以ID公司的Doom和Quake系列引擎和Epic公司的Unreal引擎開始面世,諸多通用的功能模塊、亮眼的游戲畫面和較為易用的編輯器,使得它們成為當時的主流游戲引擎。(下圖)


    上世紀90年代的Doom、Quake、Unreal引擎的游戲畫面。

    早期的游戲引擎編輯器界面。

    2000年前后,Quake和Unreal引擎發展到了第三代,部分游戲引擎發展的描述和時間線如下圖所示:

    關于Doom、Quake、Unreal引擎更詳細的時間線如下圖所示:

    引擎核心模塊愈來愈多,尤其引擎渲染、粒子等效果的完善,使得游戲也愈發炫酷。

    2008年發行的用UE3研制的音樂類游戲Nurien Mstar Online。

    在隨后的短短數年間,各類游戲引擎如雨后春筍般涌現,除了老牌的Quake、Unreal、CryEngine外,還誕生了Torque、BigWorld、Gamebro、Irrlicht、OGRE等等引擎,觸發了百擎大戰的序幕。這股風潮也吹到了國內,幾乎每個游戲公司都有引擎團隊,做自研引擎工作或對國外引擎進行二次改造。那時候的許多引擎程序員都有個夢想,那就是擁有個人的游戲引擎。

    隨著游戲品質要求的提高,對引擎技術、工具鏈的要求越來越高,許多技術底子本就不深厚的團隊逐漸無法滿足需求,敗下陣來,從歷史的舞臺褪去。逐漸形成了少數技術雄厚的老牌游戲引擎鼎立的架勢,引擎的天下被他們分而治之。

    其中后起之秀就有Unity引擎,它以小巧、跨平臺、簡單易上手著稱,被廣泛用于移動游戲和網頁游戲。Unity以Entity-Component的場景對象結構為核心,簡化了場景節點管理,提升了可擴展性,避免以往的以繼承為主的類型爆發式增長。后續在Entity-Component的基礎上,發展成了ECS(Entity-Component-System)。

    Unity的GameObject-Component模式。

    Unreal的繼承和Entity、Component相結合的模式。

    游戲對象以各種方式相互關聯,可以繪制描述這些關系的圖表,任何這樣的圖表都可以作為事件的分發渠道。

    和ECS伴隨著的是從面向對象設計(OOD)向面向數據設計(DOD)的轉變,以便明確區分實例、組件、系統并各司其職,將適用于具有某些組件集的實體的代碼形成系統,結合Structure-of-Arrays (SoA)的數據布局,利用線性遍歷提升內存訪問效率,提升緩存命中率,從而提升效率。

    OOD和DOD在內存布局上的區別。

    SOA內存布局示意圖。

    隨著功能的增加,技術的發展,現代引擎由工具套件和運行時組件組成,在引擎架構上,將硬件擴展到高級應用程序,基于的分層設計,避免循環依賴以最大化重用和可測試性。

    游戲引擎架構圖。采用了分層模式,包含了游戲相關的子系統、核心系統、資源管理器、渲染引擎、前端、平臺抽象、低級組件、第三方庫等分層。

    以上跟渲染強相關的分層或跟模塊是渲染引擎,它分為低級渲染器、場景圖管理、視覺效果、前端等層級。

    低級渲染器專注于盡可能快速和豐富地渲染圖元,不考慮可見性,圖形設備相關接口(訪問和枚舉圖形設備、初始化 GD、設置緩沖等),還有、幾何圖元的表示、相機接口的抽象、材質系統、動態照明系統、文字和字體等。

    低級渲染器的模塊詳情。

    場景圖限制提交渲染的圖元數量,使用截錐體剔除——移除可見屏幕之外的東西,采用空間細分結構(BSP、四叉樹、八叉樹、kd-tree)。

    場景圖的模塊詳情。

    場景圖的一個案例。

    視覺效果包含粒子系統、貼花系統、光照映射、動態陰影、全屏后期效果等模塊。

    前端包含HUD、菜單、用于字符操作的 GUI、用于過場動畫的全動態視頻等。

    另外,DCC工具和資產的數據流如下圖所示:

    面對大型游戲,涉及的資產非常龐大,需要一種方法來存儲和管理大量數據,一些公司使用關系數據庫(MySQL 或甲骨文),一些公司使用版本控制軟件(SVN、Perforce 或 GIT),還有一些人使用定制軟件,例如頑皮狗使用一個名為Builder的自定義GUI。

    獨立和集成兩種方式的工具架構圖。

    另外,還涉及基于網頁的工具,用于各種用途(資產管理、調度、錯誤管理),更容易構建,通常比獨立應用程序更容易構建,無需強制重新安裝即可輕松更新,如果它只需要顯示表格數據并有表格 - 使用網頁界面。

    Integrating Architecture Soar Workshop探討了如何集成不同引擎、技術棧研究的架構設計。(下兩圖)


    網絡技術的發展給游戲引擎的網絡模塊增強了動力,使得大型多人在線游戲蓬勃發展并取得矚目的成績,最典型的例子便是暴雪的魔獸世界,開啟了日常跑團副本的先鋒。(下圖)

    圖片顯示了魔獸世界游戲中的一個大型活動現場,有成千上萬的玩家在同一個地方實時地交流和互動。

    時間來到2010年前后,移動設備智能化的趨勢明顯,以iOS的移動端系統和iPhone 4的硬件設備在全世界范圍內廣泛追捧,自此拉開了移動設備智能化的歷史進程。游戲作為智能移動設備的首要功能,自然成為國內外游戲廠商的目標,因而他們都在轉型到移動游戲開發。

    2008年到2012年的游戲份額圖例,其中移動端的游戲占比逐年增加。

    2017年移動端游戲的占比已達29%。

    Unity作為小而精的代表,敏銳地察覺到移動端的商機,于是避開PC上的已然存在的眾多老牌游戲引擎的競爭,集中精力轉向移動端的研發之路。

    2012年的Unity已經支持移動端的開發。

    與此同時,由于單核CPU摩爾定律逐漸接近天花板,CPU廠商往多核的方向發展,因此,游戲引擎也在順應多核并行化發展。

    CPU的核心、頻率、性能、晶體管從1970到2014年的趨勢圖。

    并發引擎架構的層級。從上到下劃分為引擎系統層、內核層、框架層、操作系統層。

    并發引擎的循環步驟示意圖。

    另外,由于移動設備的特性,對性能異常敏感,并行化也是其趨勢之一。The Benefits of Multiple CPU Cores in Mobile Devices闡述了在移動端多核CPU的技術,如何在SMU、ARM架構的CPU上協同地和NV的Tegra 2的GPU完成并行化任務,以達到性能最大化并且省電。

    雙核ARM Cortex A9 MPcore架構。

    雙核CPU的電壓和頻率擴展優勢。

    多核化的設備使得主流游戲引擎能夠充分利用多線程的優勢,完成很多并行化的任務。下圖是其中部分游戲引擎的線程數量:

    下圖是游戲Dungeon Defender使用了NVIDIA Tegra處理器的兩個內核:

    同期的Frostbite是另一個使用基于作業的并行性的游戲引擎示例,它能夠使用底層硬件平臺提供的盡可能多的線程。引擎在GPU上執行主要的Game和Render任務,并將其它系統相關的工作劃分為作業。每個作業通常包含15K到200K行C++代碼,平均作業大小約為25K行代碼。 大多數這些工作是獨立的,而一些具有多線程游戲使用兩個 CPU 內核相互依賴。游戲的每一幀通常包含200到300個作業,并且引擎將作業分配給所有可用的硬件內核。

    Frostbite引擎上的任務級并行性。

    上圖中的每種顏色都代表Frostbite啟動的一個作業,該數據是使用Frostbite Timing View軟件在具有四核CPU和兩個處于AFR模式的GPU的PC系統上收集的,從圖中很容易看出,游戲引擎有效地使用了所有可用的內核進行任務處理。因此,這些游戲引擎將能夠有效利用 NVIDIA Tegra的兩個CPU內核和ULP GeForce GPU內核,并提供無與倫比的游戲機風格游戲體驗,這種并行技術成功地應用在了Battlefield: Bad Company等游戲上。

    啟用了多核之后,在Quake引擎上的幀率可以提升1.6倍以上,而游戲Dungeon Defender的幀率提升2倍以上。(下圖)


    在渲染技術方面,以暴雪的Naty Hoffman、迪斯尼的Brent Burly、Epic Games的Brian Karis等行業科研人員率先在實時渲染嘗試PBR技術的應用。

    PBR涉及的部分演講如下:

    Naty HoffmanPhysically Based Shading Models for Film and Game Production

    Brent BurlyPhysically Based Shading at Disney

    Brian KarisReal Shading in Unreal Engine 4

    以下是主流引擎支持PBR的時間表:

    • Unreal Engine 4:《Real Shading in Unreal Engine 4》,SIGGRAPH 2013
    • Unity 5:《Physically Based Shading in Unity》,GDC 2014
    • Frostbite(寒霜): 《Moving Frostbite to PBR》,SIGGRAPH 2014
    • Cry Engine 3.6:《Physically Based Shading in Cry Engine》,2015

    隨后PBR技術逐漸在主流渲染引擎中普及開來,成為實時互動游戲的標配技術和標準工作流。



    從上到下:Naty Hoffman科普PBR技術、迪斯尼原則的PBR參數化預覽、UE4的PBR效果。

    2015年前后,基于現代化的新生代圖形API橫空出世,典型的代表是Vulkan和DirectX 12。它們的共同特點是將諸多控制權由驅動程序轉移到了應用程序層。具體地說,新的圖形AP的特點有:

    • 允許多線程命令緩沖區記錄。

    • 減少運行時/驅動程序的工作量。

    • 減少運行時驗證。

    • 將工作移至初始化/加載時間(例如管道設置)。

    • 更明確地控制硬件。

    • 減少便利功能。

    • 精確地管理內存。

      DX12的資源管理圖例。

    這樣的轉變使得游戲引擎有了更多的控制圖形API的機會,以便做極致的渲染優化。并行化命令錄制、多線程渲染、內存精確管理和基于整幀優化的渲染圖(亦被稱為幀圖)等技術就此誕生。

    Frostbite引擎采用幀圖方式實現的延遲渲染的順序和依賴圖。

    UE作為老牌的追求渲染質量的游戲引擎,在2018年改變了原來的市場格局,在Steam平臺上顯示,25%左右的游戲采用它來制作,一舉超過了Unity,穩坐榜首。(下圖)

    在Steam上發布的游戲中使用的游戲引擎(數據來自2018-12-20)。

    此外,現代圖形API以及GPU渲染管線的進步,使得某些以往受限的渲染技術得到蓬勃發展,例如GPU驅動的渲染管線、基于Cluster的渲染、光線追蹤及實時全局光照等等。

    GPU驅動的渲染管線概覽。

    光柵化、計算著色器和光線追蹤的混合渲染管線。

    基于面元(surfel)全局光照的面元可視化。

    有了以上技術的強力支撐,使得當前的游戲達到了影視級的畫質,最突出的便是利用UE5的Nanite和Lumen等技術研制出的《黑客帝國》Demo以及游戲科學的《黑神話:悟空》。

    近些年,圖形API標準已經支持人工智能,Nvidia率先在RTX系列GPU芯片上集成了Tensor Core,由此基于深度學習的人工智能技術也大量地引入到圖形渲染和游戲引擎當中,例如光線追蹤降噪、DLSS、智能化NPC的AI、風格化渲染等等。

    DLSS關閉(左)和開啟(右)的對比圖,幀率提升了71%。

    DLSS在部分3A游戲上的加速比例圖。

    此外,除了傳統的PC、主機等實時渲染平臺,移動端、XR、網頁端和云端渲染等分支也得到了較大的發展。

    2018年主流商業引擎支持VR、移動等平臺的表格。

    2020年的移動端市場份額,達到770億美元,在新冠的陰霾下依然逆勢同比增長13.3%。

    其中由于XR設備比普通移動設備對帶寬、電量、性能更加敏感,于是誕生了注視點渲染、多視圖渲染、可變著色率、插值、預測、時間扭曲、多線程等等優化技術。

    用于優化VR等渲染的MultiView對比圖。上:未采用MultiView模式的渲染,兩個眼睛各自提交繪制指令;中:基礎MultiView模式,復用提交指令,在GPU層復制多一份Command List;下:高級MultiView模式,可以復用DC、Command List、幾何信息。

    Arm在UE上使用4-視圖的多視圖進行注視點渲染,可以減少65%的渲染工作量。

    14.1.5 內容概要

    本篇將時間作為主線,劃分成幾個部分:

    • 萌芽期(1999之前)
    • 成長期(2000~2009)
    • 開花期(2010~2015)
    • 結果期(2016~2021)

    內容主要圍繞著游戲引擎的架構和渲染部分,但不僅僅限于此,還包含相關的模塊或筆者認為值得關注的內容。

     

    14.2 萌芽期(1999之前)

    游戲引擎始于1990年代中期,尤其是與第一人稱射擊游戲 (FPS) 等3D游戲相關,也就是Doom(下圖)和Quake游戲的流行,其他開發人員不用從頭開始工作,而是授權軟件的核心部分并設計自己的圖形、角色、武器和關卡。

    左:Doom游戲截圖;右:Doom 3游戲截圖。

    盡管游戲引擎的術語在1990年代才首次使用,但在1980年代也有一些較早的系統也被認為是游戲引擎,例如Sierra的AGI和SCI系統、LucasArts的SCUMM系統和Incentive Software的Freescape引擎。然而,與大多數現代游戲引擎不同,這些游戲引擎從未用于任何第三方產品。后來的游戲,例如Quake III Arena和Epic Games的1998 Unreal,在設計時就考慮到了這種方法,引擎和內容是分開開發的。至少,可重用引擎使開發游戲續集變得更快、更容易,這在競爭激烈的計算機游戲行業中是一個寶貴的優勢。

    左:Unreal的Skaarj角色截圖;右:Unreal 3的Berserker角色截圖。

    在早期的PC開發游戲,最簡單的游戲循環如下所示(想必學過windows開發的同學肯定接觸過):

    // 開始消息循環
    MSG kMsg;
    while ( TRUE )
    {
        // 優先處理消息
        if ( PeekMessage(&kMsg,(HWND)0,0,0,PM_REMOVE) )
        {
            if ( kMsg.message == WM_QUIT )
                break;
            HACCEL hAccel = (HACCEL)0;
            if ( !TranslateAccelerator(hWnd,hAccel,&kMsg) )
            {
                TranslateMessage(&kMsg);
                DispatchMessage(&kMsg);
            }
        }
        else // 空閑循環
        {
            // 繪制調用
            Draw();
        }
    }
    

    上面的Draw函數繪制過程(OpenGL為例)的最簡單的實現如下:

    void Draw()
    {
        // 清理緩沖區顏色
        glClear(GL_COLOR_BUFFER_BIT);
        // 設置渲染狀態
        glDisable(GL_CULL_FACE);
        // 設置模型到世界的變換
        glMatrixMode(GL_MODELVIEW);
        glPushMatrix();
        glMultMatrixf(gs_afMatrix);
        // 繪制三角形
        glBegin(GL_POLYGON);
        glColor3f(gs_afColor0[0],gs_afColor0[1],gs_afColor0[2]);
        glVertex3f(gs_afVertex0[0],gs_afVertex0[1],gs_afVertex0[2]);
        glColor3f(gs_afColor1[0],gs_afColor1[1],gs_afColor1[2]);
        glVertex3f(gs_afVertex1[0],gs_afVertex1[1],gs_afVertex1[2]);
        glColor3f(gs_afColor2[0],gs_afColor2[1],gs_afColor2[2]);
        glVertex3f(gs_afVertex2[0],gs_afVertex2[1],gs_afVertex2[2]);
        glEnd();
        // 恢復之前的變換
        glMatrixMode(GL_MODELVIEW);
        glPopMatrix();
        // 交換緩沖區,將后臺緩沖區復制到前臺緩沖區
        SwapBuffers(gs_hWindowDC);
    }
    

    當然,以上只能對應簡單案例,例如繪制Hello World這樣的場景。對于復雜的場景,需要引入更多技術、加入更多調用,從而形成更復雜的游戲主循環。下圖是3D Game Engine Architecture提及的一種場景節點的交互圖:

    空間類、節點類、幾何類和渲染類之間的相互關系。

    在當時,場景的節點組織結構以繼承為主(尚未出現Entity-Component和ECS),物體的數據結構以Entity為節點:

    早期游戲場景的Entity節點結構圖例。

    早期游戲場景的Entity節點結構圖例2。

    隨著時間遷移,各種新興的渲染技術和硬件的進步(如紋理映射、抗鋸齒、像素和頂點著色、改進的陰影生成、增加的內存帶寬、增加的填充率……),使得游戲的環境更加逼真,而且它們也愈加復雜、絢麗。(下圖)

    id公司研發的游戲隨時代演變的畫面。從左上到右下依次是Wolfenstein 3D(1991)、DOOM(1994)、Quake(1996)、Quake 3(1999)、DOOM 3(2004),肉眼可見的畫質進步。

    隨著物體、光源的增加,渲染技術越來越復雜,使得渲染狀態需要執行復雜的管理,以便提升效率。下圖是3D Game Engine Architecture闡述的渲染狀態更新技術:

    更新渲染狀態的情況。通過樹狀結構,游戲引擎可以方便地收集依賴關系和渲染狀態。

    在光照上,此時期的游戲常以多紋理獲得光照效果。(下圖)

    多重紋理以獲得暗圖和光圖。左上:木質的主要紋理,右上:與主要紋理結合的次要紋理,左下:一張暗圖,下中:使用硬疊加的光照圖,右下:使用軟疊加的光照圖。

    CryEngine1為太陽陰影提供了陰影貼圖和每個對象的投影陰影。為了提升性能,預先計算了植被陰影,但內存限制為非常模糊的紋理。對于高端硬件配置,CryEngine1為植被添加了陰影貼圖,但將它們與預先計算的解決方案結合起來依然有不少問題。

    CryEngine1將模板陰影用于點光源,以獲得更簡單、更有效的解決方案。CPU蒙皮允許在CPU上提取陰影輪廓,然后在GPU渲染模板陰影。很顯然,當想要渲染更詳細的對象時,這種技術會成為一個問題,因為它依賴于CPU蒙皮,需要額外的CPU計算、上傳到GPU、邊緣數據結構的額外內存,并且幾乎沒有可預測的性能特征。由于缺少對alpha混合或經過測試的陰影投射器的支持,因此該技術甚至無法用于棕櫚樹(下圖)。

    Far Cry游戲截圖,使用了軟預計算陰影與實時陰影相結合的方案。

    在此階段,已經誕生網格的LOD技術,下圖展示了同一個網格的兩個LOD的外觀和三角形數量:

    地形渲染也初見雛形,擁有了較大的視野、LOD過渡、特殊的紋理過濾(如雙線性、各向異性)和霧效:

    在此階段,也已經興起了Billboard(公告板)技術,用于粒子特效及部分遠景物體的模擬。

    14.2.1 圖形API

    14.2.1.1 DirectX

    DirectX是微軟定制的圖形API標準,是當今非常流行的主流圖形API標準之一,是一組應用程序編程接口 (API),專用于Microsoft平臺上處理與多媒體相關的任務,尤其是游戲編程和視頻。最初,這些API的名稱都以“Direct”開頭,如Direct3D、DirectDraw、DirectMusic、DirectPlay、DirectSound等。DirectX這個名稱是作為所有這些API的縮寫詞(X代表特定的API名稱)而創造的,并很快成為該集合的名稱。

    隨版本變化的DirectX圖標。

    微軟最早于1995年發布DirectX 1.0版本,隨后幾乎保持一年一發布的速度。截至1999年,已經發展到了DirectX 7.0。1996年微軟發布了DirectX 2和3兩個大版本。另外,因特殊原因,DirectX 4從未被公開發布。(下圖)

    DirectX 3.0的圖形特性包含硬件級加速的位圖、表面、線條繪圖,支持高位圖的顏色深度,擁有一個支持MMX的光柵化器。

    DirectX 3.0研制的游戲截圖。

    DirectX 5.0的圖形特性包含新增直接將多邊形信息直接傳遞到硬件的DrawPrimitive接口、程序化網格和增強的動畫、與排序無關的抗鋸齒、基于范圍的霧、各向異性紋理過濾、無緩沖隱藏表面消除等。

    graph TD A(Stipple Test) --> B(Z-Buffer) B --> C(Fetch Texels from single texture. Filter to final texture color.) C --> D(Texture Blend) D --> E(Add Specular) E --> F(Apply Fog) F --> G(Alpha Blend) G --> H(Write to Frame Buffer)

    DirectX 5.0的固定渲染管線。

    DirectX 5.0研制的游戲截圖。

    DirectX 6.0的圖形特性包含更快的性能、用于更好照明和轉換的更好的幾何引擎、為具有硬件3D加速器的用戶提供更快的軟件光柵化器,以及對多紋理、凹凸貼圖、紋理壓縮、模板緩沖區和W緩沖區等。

    DirectX 6.0的立方體環境貼圖效果。

    DirectX 6.0研制的游戲截圖。

    DirectX 7.0的圖形特性包含多紋理(組合兩個或多個紋理貼圖,如光照貼圖)、立方體環境貼圖、硬件變換和光照、頂點混合(GPU骨骼蒙皮)等。

    DirectX 7的光照圖效果。

    DirectX 7的立方體環境圖效果。

    DirectX 7的頂點混合(GPU骨骼蒙皮)效果。圖左沒有頂點混合,圖右啟用了頂點混合。

    14.2.1.2 OpenGL

    OpenGL(開放圖形庫)是獨立于平臺的2D和3D可視化規范標準,由Silicon Graphics Inc于1992年推出,ARB(架構審查委員會)聯盟負責其開發,會員為各大軟硬件廠商(ATI、NVIDIA、英特爾、微軟等),2006年由Khronos Group聯合接手其開發。OpenGL的一個特點是開發緩慢,因為規范化是一個緩慢的過程,極大地阻礙了圖形密集型應用程序的開發者。

    在1999年及之前,OpenGL發布的版本和特性如下表所示:

    版本 時間 特性
    1.0 1992年6月 一組基準功能、支持擴展
    1.1 1997年3月 紋理對象、頂點數組
    1.2 1998年3月 3D紋理、BGRA和打包像素格式、成像子集
    1.2.1 1998年10月 增加ARB擴展的概念

    OpenGL存在開發擴展套件GLFW,是一個開源的多平臺庫,用于桌面上的OpenGL、OpenGL ES和Vulkan開發,提供了一個簡單的API,用于創建窗口、上下文和表面,接收輸入和事件。它具有如下特點:

    • 支持 OpenGL、OpenGL ES、Vulkan 和相關選項、標志和擴展。
    • 通過輪詢或回調支持鍵盤、鼠標、游戲手柄、時間和窗口事件輸入。
    • 支持多窗口、多顯示器、高 DPI 和伽馬映射。
    • 易于集成到現有應用程序中。
      • 只需兩個函數調用即可為您提供窗口和 OpenGL 上下文。
      • 附帶教程、指南和參考文檔、示例和測試程序。
      • 許多不同語言的社區維護綁定。
    • 用 C 語言編寫。
      • 原生支持 Windows、OS X 和許多類 Unix 系統(Linux、FreeBSD)。
    • 具有 OSI 認證許可證的開放源代碼,允許商業使用。
      • 訪問本機對象和平臺特定功能的編譯時選項。

    除了GLFW,還有GLEW、GLUT、gl3w、glad等等擴展庫,具體列表見:OpenGL Related toolkits and APIs

    14.2.2 硬件架構

    1995年,Nvidia發布了NV1的顯卡,晶體管達到100萬個,特性是16位色彩、最近點過濾,性能達到每秒處理5萬個三角形、100萬個像素和

    1996年,3dfx公司發布了 Voodoo 1代GPU,是第一張3D加速卡(4MB RAM,50 Mhz),僅支持3D可視化,需要一個額外的2D視頻卡,在市場上獲得巨大的成功。它的理念是將2D變換由快速的2D顯卡執行,例如流行的Matrox視頻卡,而3D變換由Voodoo卡執行,Voodoo的硬件能夠進行比軟件渲染更快的計算。

    一個典型的Voodoo Graphics PCI擴展卡包括一個DAC、一個幀緩沖處理器和一個紋理映射單元,以及4 MB的EDO DRAM,DRAM和圖形處理器以50MHz運行。它只提供3D加速,因此計算機還需要傳統的視頻控制器來處理傳統的2D軟件。

    搭載Voodoo 1芯片的顯卡外觀。

    同年,NVIDIA和ATI(后被AMD收購)開始了自己的GPU系列,例如Nvidia的(NV1、RIVA 128、Geforce 256),ATI的3D Rage、Rage Pro、Rage 128等。顯卡一經面世,立刻大受歡迎,主要原因是合理的價格、廣泛的銷售渠道和被游戲和操作系統(主要是Windows)支持。

    在隨后的短短兩年內,3dfx公司陸續推出了Voodoo Rush、Voodoo 2等芯片。Voodoo Rush將2D和3D統一在了一塊,無需額外的2D處理器。但由于2D和3D的帶寬爭用,Voodoo Rush性能并不佳。

    此外,Rush芯片組并不直接存在于PCI總線上,而是必須通過2D芯片的鏈接寄存器進行編程。與Voodoo Graphics一樣,沒有中斷機制,因此驅動程序必須輪詢Rush以確定命令是否完成;通過2D組件的間接性在這里增加了顯著的開銷,并傾向于備份PCI接口上的流量。與Voodoo Graphics相比,典型的性能損失約為10%,在窗口模式下甚至更糟。Voodoo Rush卡的銷售非常糟糕,并且這些卡在一年內就停產了。

    1998年3月,Voodoo 2面世,架構上和1代類似,但硬件上增加了第二個紋理單元,支持一次繪制兩個紋理。Voodoo 2需要三個芯片和一個單獨的VGA顯卡,性能上比同期其它產品都要好,但也存在一些限制。Voodoo2引入了掃描線交錯 (SLI),其中兩塊Voodoo2板連接在一起,每塊畫出屏幕掃描線的一半,SLI將支持的最大分辨率提高到 1024×768。由于使用三個獨立顯卡(兩個 Voodoo 2 SLI加上通用2D圖形適配器)的高成本和不便,Voodoo2 SLI方案對總市場份額的影響很小,在財務上并不成功。

    幾個月后,帶有集成2D/3D芯片組的Nvidia RIVA TNT(下圖)發布,對Voodoo2的霸主地位構成輕微挑戰。RIVA TNT添加了第二個像素管線,使得渲染速度翻倍,并且使用了更快的內存。與Voodoo2不同,它還增加了對32位(真彩色)像素格式、3D 模式下的24位深度緩沖區、8位模板緩沖區和對1024×1024像素紋理的支持。此外,改進的mipmapping和紋理過濾技術,包括新添加的對三線性過濾的支持,與TNT的前身相比顯著提高了質量,TNT還增加了對高達16MiB SDR SDRAM的支持。與RIVA 128一樣,RIVA TNT是單芯片解決方案。

    Nvidia RIVA TNT芯片外觀。

    1999年,Nvidia的GeForce 256(NV10)發布,特點是固定管線,支持DirectX7.0,硬件及坐標變換和光照,支持立方體環境圖、凹凸貼圖、2x各項異性過濾、三線性過濾、DXT紋理壓縮等功能。

    在90年代,顯卡的部件和布局尚顯簡單,最明顯的是散熱裝置,98年的顯卡只需要少許散熱片,到了03年,便需要風扇來散熱(下圖)。

    顯卡除了物理部件的改進,處理速度和帶寬也在飆升,呈現或超越摩爾定律曲線。下圖是NVidia的從TNT(1998)到GeforceFX 6800(2004)每秒處理三角形數的曲線圖:

    圖形API標準和GPU硬件的發展,使得游戲引擎如虎添翼,在此時代有了較大的發揮空間。

    14.2.3 引擎發展

    人類歷史上第一款電腦游戲通常認為是1962年的Spacewar,游戲中有兩艘玩家控制的宇宙飛船在原始2D顯示器上呈現,盡管更簡單的游戲甚至更早之前就存在。早期的電腦游戲由低分辨率屏幕上的簡單2D圖形組成,這種趨勢一直持續到1990年代。

    1962年的電腦游戲Spacewar,通常被認為是人類歷史上第一款電腦游戲。

    運行早期游戲的硬件非常有限,迫使開發人員從系統中獲取所有處理能力,例如用匯編語言對游戲進行編程,過去的游戲工程主要是關于低級優化。由于硬件有限,早期計算機游戲的架構非常少,僅由事件循環、狀態表和圖形例程組成。這些游戲彼此之間幾乎沒有共享可重用元素,這意味著新游戲通常是從頭開始編程的。

    在早期的冒險游戲中可以看到一絲早期類似引擎的架構,其中第一個是Colossal Cave Adventure,標志著基于文本的互動小說類型的開始,其中游戲玩法包括閱讀設置的文本表示并輸入簡單的命令與之互動。基于文本的冒險在早期游戲中非常流行,后來,結合圖形催生了圖形冒險類型的架構,但結構非常簡單,僅有狀態表形式的游戲邏輯、最小級別數據和一個幾乎難以識別的事件管理器。

    盡管Adventure的架構很簡單,但可以清楚地看到數據驅動設計的元素,這就是典型的游戲引擎:游戲的內容與代碼明顯分離。原則上甚至可以通過更改數據和不理會代碼來創建游戲的修改版本。

    Adventure的一些繼任者都深受其影響,包括Adventureland(Adventure International,1978 年)、Zork(最初由 MIT 的幾個學生于 1977年編寫,后來Infocom在1980-1982年作為三款不同的游戲發行)和Mystery House (1980年)。雖然Adventureland的機制與原始Adventure幾乎相同,但Zork和Mystery House在冒險游戲的開發中產生了兩個分支。Zork和其他Infocom的游戲仍然是純文本的,但具有極大改進的命令解析器,而Mystery House以基本圖形為特色(盡管玩家命令仍以文本形式輸入),開創了圖形冒險游戲的類型。 盡管如此,Infocom的基于文本的游戲在一段時間內更受歡迎,有行業人士后來評論說,當時有限硬件上的圖形處理剝奪了本來可以呈現的游戲深度。

    左:Mystery House(1980) 右:The Secret of Monkey Island(1990)。

    1980年的太空恐慌(Space Panic)是一個單屏游戲,其中一個角色在一個屏幕上移動,躲避外星人,爬上爬下梯子并在地上挖洞。像Donkey Kong(Nintendo,1981年)這樣的游戲增加了額外的功能,比如跳躍的能力。更進一步的發展出現在像《超級馬里奧兄弟》(任天堂,1985年)這樣的游戲中,它用橫向滾動機制取代了單屏機制,并添加了其它功能。

    左: Space Panic (1980);右: Super Mario Bros(1985)。

    在1980年代中期,有一些小型獨立視頻游戲工作室,研制小型的平臺游戲,平臺游戲通常是游戲玩家通過在靜態和移動平臺和壁架上奔跑和跳躍來導航角色穿過充滿敵人的關卡(下圖)。此類游戲取得了巨大的成功,讓全世界的游戲玩家感到高興。

    Darwin the Monkey游戲截圖。

    與早期游戲架構的情況一樣(冒險類型的游戲除外),關于早期平臺架構的文獻很少。Blow(2004)提供了一些見解,命名了一個 1990年代的2D游戲的一些模塊(流式文件 I/O、聲音、主要/雜項、模擬、快速2D圖形),同時指出其它類型的游戲可能包含不同的部分,例如獲得AI的一部分,可能會失去快速圖形節點。

    上世紀90年代之前,由于沒有成熟的游戲引擎,開發游戲異常困難,并且會重復做很多類似的功能,生產力低下,畫面效果顆粒感十足。

    在開發游戲過程中,有些游戲工作室對每個游戲都是從新造輪子,這樣的后果就是開發一個游戲的時間愈來愈長,并且發現競爭對手研發游戲的時間卻在逐漸縮短。而縮短研制游戲周期的工作室正是采用了復用的思維,所有游戲和所有平臺游戲共有的許多屬性和功能都可以從他們的特定游戲中提取出來,將上一個項目抽象出可重復使用或基礎的模塊,以便快速用于下一個游戲項目,從而不斷地縮短游戲開發時間。

    這些工作室不僅發現了最初的一些通用模塊,而且幾乎認出了所有游戲的可通用組件并將它們集成到單個系統中可以重復使用以制作許多不同的游戲。他們知道游戲內容(圖形和聲音)可能需要在逐個游戲的基礎上創建,由于游戲的外觀和聲音不同,但他們也意識到存在支持此內容的框架(或基礎架構),而這主要是可抽象的。這個框架或系統被稱為游戲引擎。

    1990年代,具備系統的游戲引擎有兩個系列,一個是ID的Doom和Quake系列,另一個是Epic Games的Unreal系列。

    許多人認為計算機游戲(尤其是游戲引擎)的轉折點是FPS類型的誕生,id Software發行了Wolfenstein 3D (1992) 和Doom (1993),尤其是《毀滅戰士》,廣泛地流行游戲愛好者中。

    Doom的架構也值得關注,Doom的核心軟件組件(例如圖形渲染、碰撞檢測和音頻)與游戲內容(例如藝術資產、游戲世界和游戲規則)分離,意味著用戶可以在游戲中添加新的關卡、模型和其它資產,有效地創建自己的新游戲。雖然Doom的可編程程度很小,并且從它衍生的游戲繼續像原始游戲一樣玩,但多家公司授權id Software的Doom引擎來制作他們自己的商業游戲。因此,雖然不是第一個使用數據驅動架構的游戲,但將其流行歸因于Doom或許并不牽強。

    Doom渲染畫面(1993)。

    Doom之后是Quake(id Software,1996 年),它繼承了Doom的功能,具有真正的3D圖形和客戶端/服務器架構。Quake還提供了一個真正獨立于游戲的游戲引擎,包含一個關卡編輯器和QuakeC(一種可以改變游戲行為的腳本語言)。這是對Doom將數據文件添加到游戲可執行文件的方法的重大改進,并且可編程性極低。Quake的引擎由兩部分組成:客戶端和服務器,所有輸入(鍵盤、鼠標、操縱桿)和輸出(3D 渲染、2D 繪圖和聲音)都發生在客戶端,以及所有實際的游戲玩法,例如玩家運動和物理模擬、AI和QuakeC腳本都在服務器上進行。客戶端從玩家那里獲取輸入并將其發送到服務器,服務器在固定的時間內處理游戲,然后將游戲的狀態發送回客戶端,客戶端為玩家提供視聽輸出。

    Quake III Arena的渲染畫面(1999)。

    Quake的單人游戲和多人游戲都建立在這種架構之上。在多人游戲中,多個客戶端通過網絡層與單個服務器(通常在不同的機器上運行)進行通信,而單人游戲使用共享內存緩沖區進行通信,并且每個處理幀都在從客戶端獲取輸入之間拆分,在服務器上處理游戲并在客戶端上輸出。

    除了簡化多人游戲中的同步問題(與Doom相比,所有玩家運行自己的游戲模擬并且機器同步進行),客戶端-服務器架構強制執行模塊化設計,簡化調試并保持單人游戲和多人游戲代碼相同。

    緊隨Quake其后的是Quake II(id Software, 1997)和Quake III Arena(id Software, 1999)。隨著引擎從Quake 1引擎發展到第三次迭代(Quake 3),它的大小也在隨著源代碼行數 (SLOC) 和源代碼模塊的數量增長。隨著時間的推移,引擎也變得更有條理,因為第一個版本中的源代碼文件只存在于一個文件夾中,而后續版本將源文件組織成一個子文件夾樹。在這些版本的引擎中都發現了幾個模塊:

    • 通用功能模塊。
    • 游戲邏輯模塊。
    • 服務器特定功能模塊。
    • 客戶端功能模塊。
    • 聲音和視頻輸出模塊(在以后的版本中分離)。

    研究中分析的所有引擎都是用C編程語言編寫的,但是,引擎的第四個版本id Tech 4已經使用C++和面向對象的范式進行了完全重新設計。

    聊完1990年代的Quake系列,回過頭來再聊聊同期的Unreal引擎。

    1991年的ZZT,基本上是一個游戲引擎,其中植入了游戲。該引擎公開了一種小腳本語言,雖然它非常基礎,但它是一種完整的腳本語言,可以使用它來編寫小游戲腳本。它有一個實時的所見即所得交互式編輯器,用于創建關卡,可以通過幾次擊鍵來回切換,添加一個關卡,進行游戲測試并對其進行迭代, 這種交互式工作流程確實是其中的關鍵。

    ZZT的游戲模式和編輯模式。

    Turbo Pascal是一個易于使用的編輯器,用于創建代碼和編譯東西,輸入代碼的幾秒鐘后它會被編譯,接著就可以運行它。這種編碼方式與之前使用的所有東西相比,創建東西的迭代過程體驗十分友好。

    Turbo Pascal的編輯器。

    隨后,Epic Games的Tim Sweeney受ZZT和Turbo Pascal的啟發,開啟了Unreal引擎的研發之旅,Unreal初代版本的很多核心功能和ZZT相似,編輯器則和Turbo Pascal相似。

    1998年的Unreal Ed編輯器,使用了Visual Basic。

    在隨后的若干年,隨著技術的演變,Unreal編輯器先后嘗試了Visual Base、wxWidget、Slate等UI框架,逐漸形成了如今的編輯器風格和交互方式。后續的Unreal Engine加入了Game Play框架,可以給開發人員快速提供一個可用和可擴展的基礎:

    Unreal Engine的game play框架圖。

    除了Quake和Unreal,此時期還存在其它游戲引擎的發展。例如TerraForm3D Plasma Works 3D Engine & USGS Terrain Modeler提到了如何設計一款簡潔的引擎(Plasma Works Engine)。Plasma Works Engine的目標是滿足雙方需求的 3D 引擎設計、基于對象的渲染器、嘗試各種特殊效果,以及高質量的圖像渲染器、用戶驅動的圖像處理等。

    Plasma Works Engine渲染效果圖。

    在架構上,以前是單個引擎、相同的建筑基礎、開源和專有的問題,現在是兩個分離的引擎、不同的架構、OpenGL獨有的擴展(GLUT)。

    Plasma Works Engine架構圖。分為物體和渲染器,它們又引用了各種資源和對象。

    Plasma Works Engine初始化和循環流程圖。

    在數據流上,客戶端采用了命令驅動式機制,驅動物體和渲染器,最終渲染出畫面像素和光源信息:

    Plasma Works Engine的地形建模器涉及不少的包體接口,它們的交互關系如下:

    在地形生成和處理上,采用了并行化的分布式架構:

    下圖是地形編輯器界面:

    下圖是地形并行化處理的界面:

    雖然站在現在的角度,略顯初級,但在當時,能夠并行化處理是非不易,會遇到IO、紋理帶寬、同步、設計模型等諸多方面的問題。

    1995年,Architectural Blueprints—The “4+1” View Model of Software Architecture提到了一種4+1視圖的軟件結構:

    • 邏輯視圖(Logical View),說明對象模型。
    • 流程視圖(Process View),處理并發的流程和同步問題。
    • 物理視圖(Physical View),描述“軟件的映射到硬件上并反映其分布式方面。
    • 開發視圖(Development View),代表軟件在其開發環境中的靜態組織,添加了組件、它們的接口和它們相互關聯的組合的概念。
    • 場景(Scenario),描述了對象之間和進程之間的交互序列,它們用于識別架構元素并說明和驗證架構設計,還可以作為架構原型測試的起點。此視圖也稱為用例視圖。

    4+1視圖的軟件結構。

    這種視圖的軟件架構也可以引入到游戲引擎的架構設計中,比如揭示引擎核心類的UML圖便是邏輯視圖,引擎的工具鏈便是開發者視圖,資源文件的加載分層和部署方式便是物理視圖。

    此階段的引擎已大致成形,架構的組件大致如下所示:

    若是細化各個模塊,則是如下圖所示:

    時間來到新世紀,誕生了不少新的渲染引擎或組件,其中就有典型代表Ogre。作為Ogre的衍生引擎Ogre Golf,在Orge的基礎上做了不少擴展,引入了許多特性和第三方庫,并且研制了代表游戲,例如包含了忍者、機器人、消防栓、城堡、術士等物體的大型迷你高爾夫球場,該游戲支持多人聯網互動。

    Ogre Golf渲染畫面。

    在同期,還出現了Irrich、Delta3D、Panda、OSG等引擎,它們各具特色,在引擎的各項特性(渲染、功能、場景、地形、視覺、跨平臺等)上的支持程度如下表所示:




    此階段引擎的邏輯循環和渲染循環如下所示:

    
    // 邏輯循環
    while (true)
    {
        for (each frameListener)
        {
            frameListener.frameStarted();
        }
        renderCurrentScene();
        for (each frameListener)
        {
            frameListener.frameEnded();
        }
        finalizeSceneAndSwapBuffers();
    }
    
    // 渲染循環
    while (!quit)
    {
        // 修改相機屬性。
        updateCamera();
        // 修改場景物體的屬性。
        updateSceneElements();
        // 渲染場景上的物體。
        renderScene();
        // 呈現交換鏈(啟用多緩沖的情況下)。
        swapBuffers();
    }
    

    至此,游戲引擎的萌芽期總算順利完成,逐漸形成了基礎的模塊、架構和渲染技術。

     

     

    • 本篇未完待續。

     

     

    特別說明

    • 感謝所有參考文獻的作者,部分圖片來自參考文獻和網絡,侵刪。
    • 本系列文章為筆者原創,只發表在博客園上,歡迎分享本文鏈接,但未經同意,不允許轉載
    • 系列文章,未完待續,完整目錄請戳內容綱目
    • 系列文章,未完待續,完整目錄請戳內容綱目
    • 系列文章,未完待續,完整目錄請戳內容綱目

     

    參考文獻

    posted @ 2022-04-03 20:08  0向往0  閱讀(1286)  評論(3編輯  收藏  舉報
    国产美女a做受大片观看