你們好,如今開始本系列的第三部分,按照如下幾個步驟來搭建引擎雛形:
一、分析引擎的需求
二、實現最小的3D程序
三、從中提煉引擎原型
四、一步一步地對引擎進行改進,使其具有良好的架構
五、實現與架構相關的功能,如「多線程渲染」、「延遲渲染」等功能html
本文進行第一步,分析引擎的需求。程序員
上一篇博文
從0開發3D引擎(七):學習Reason語言編程
下一篇博文
從0開發3D引擎(九):實現最小的3D程序-「繪製三角形」瀏覽器
業務目標
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幀才能流暢運行,因此引擎對於性能要求很高。 本系列在搭建引擎雛形時,會進行屢次性能測試,從而保證使用最佳性能的方案來構建引擎底層。