從0開發3D引擎(八):準備“搭建引擎雛形”
大家好,現在開始本系列的第三部分,按照以下幾個步驟來搭建引擎雛形:
1、分析引擎的需求
2、實現最小的3D程序
3、從中提煉引擎原型
4、一步一步地對引擎進行改進,使其具備良好的架構
5、實現與架構相關的功能,如“多線程渲染”、“延遲渲染”等功能
本文進行第一步,分析引擎的需求。
上一篇博文
下一篇博文
業務目標
1.手把手教讀者如何從0開發3D引擎
2.學習函數式編程及其在3D領域的應用
3.學習3D編程中基礎的功能實現,如紋理、光照、模型等
4.學習引擎的設計和架構,如Data Oriented、多線程等
本系列開發的引擎屬于最簡化的引擎,讀者可以根據自己的需要在此基礎上對引擎進行擴充,滿足自己的應用場景。
范圍
- 簡單渲染
引擎只有最基礎的光照和紋理功能。 - 簡單交互
引擎只能通過“操作相機”來交互。 - 適當的擴展
引擎支持主要的擴展方式,如使用腳本組件來插入用戶邏輯,實現動態場景。
Feature
- 最小功能
- 完全函數式的架構
- 支持良好的擴展性
- 優秀的性能
上下文

- 開發者
開發者是直接使用引擎來開發Web 3D應用的程序員。 - 編輯器
編輯器屬于對引擎的二次開發。它對引擎進行封裝,以“所見即所得”的方式向用戶提供對Web 3D場景編輯的界面,從而使用戶可以很方便地開發Web 3D應用。
功能性需求

- GameObject和Component
引擎是ECS架構,場景是由多個GameObject組成,而每個GameObject又由多個組件(Component)組成。
其中,組件包括Transform、Geometry等。 - 多線程渲染
如果瀏覽器支持Shared ArrayBuffer和OffscreenCanvas,那么引擎可以打開多線程渲染,使用兩個線程:主線程和渲染線程。 - 前向渲染和延遲渲染
引擎支持前向渲染和延遲渲染,用戶可以選擇其中一種進行渲染。 - 光照
引擎只支持方向光。 - 紋理
引擎只支持最基本的紋理。 - Scene Graph
引擎使用自定義的wdb格式保存場景數據,并支持它的導入和導出。 - 相機
引擎支持用相機與場景交互,包含幾個子功能點:- 支持透視投影相機
- 事件
引擎綁定和封裝了事件,統一了pc端和移動端的事件。 - 支持相機控制,如漫游相機
- 擴展
引擎支持用擴展來實現自定義功能,包含幾個子功能點:- 自定義渲染管道
- 腳本組件
- 自定義材質
非功能性需求
引擎對于“質量”要求高,因為它是需要長期開發和維護的項目,而且具有很高的技術復雜度。
開發期質量
- 高可擴展性
因為本系列開發的引擎屬于通用引擎,需要支持各種應用場景,所以要求引擎便于擴展。
本系列主要通過腳本組件等功能來支持擴展。 - 高可維護性
引擎需要長期維護,所以需要引擎代碼健壯,易于維護。
本系列主要通過契約檢查、強類型語言Reason自帶的編譯檢查、代碼重構來確保可維護。 - 低可測試性
照理說,引擎需要很高的可測試性,這樣在長期的開發中能顯著降低錯誤率,提高效率。但是本系列為了節省篇幅,沒有寫自動化測試用例,而是通過“運行測試”來驗證正確性。
建議讀者在實際開發中,保證較高的自動化測試覆蓋率。
運行期質量
- 高性能
因為使用引擎渲染的3D應用,特別是3D游戲,至少需要每秒30幀才能流暢運行,所以引擎對于性能要求很高。
本系列在搭建引擎雛形時,會進行多次性能測試,從而保證使用最佳性能的方案來構建引擎底層。
浙公網安備 33010602011771號