閱讀一款3D引擎的方法備忘

閱讀一款3D引擎的方法備忘 
要帶着引擎系統所共有的問題去閱讀,不要被具體引擎的實現思路牽着走,要思考這個引擎如何實現或繞過(如不考慮低端機)這些必然要面臨的問題.

首先,最重要的必須,在Debug模式下調試起來一個主場景程序,然後沿着代碼流走幾遍,在代碼裏閒逛,生成第一印象,留意基礎工具設施類(如字符串內存管理),大約3小時.
然後帶着如下每一個問題(不分先後)去走流程,走邏輯,弄清引擎的業務處理方法.

1.SetStreamSource,SetIndices,DrawIndexedPrimitive的調用是在哪裏(哪個cpp哪個類的哪個函數),整個工程有幾個DrawIndexedPrimitve,DrawPrimitveUp,DrawXXX,被統一管理了嗎,還是零零散散地分佈在各個cpp各個類?

2.紋理資源是如何管理的?句柄,ID,指針? 按使用時間,按使用計數? 模型頂點資源是如何管理的,是否有Buffer分配上的優化(比如頂點緩衝整合)? 渲染的實例數據如何管理,如何與資源概念區分的? 純3D資源如Shader/RenderTarget是如何管理的?

3.場景管理是怎樣搭建的,如何包含區分節點實例數據和資源數據?鏡頭是如何被各模塊訪問的?剔除不可見物件的代碼行在哪裏?兼容各種算法嗎,使用了具體的算法是什麼?不論使用何種算法,場景管理模塊是否提供了清晰的需求定義接口?

4.骨骼動畫是在哪裏計算的,具體到頂點乘以矩陣是在哪個cpp的哪個代碼行裏?Socket實現在哪裏?如果有高級動畫系統,骨架在哪裏,有什麼功能?動作融合的矩陣間過渡代碼在哪一行?

5.異步數據加載是怎樣做的,在哪個cpp裏,由哪個模塊管理?各個資源的加載讀取cpp代碼行在哪裏?

6.渲染管線如何爲ShadowMap提供深度圖,如何爲CubeMap,水面反射提供場景RenderTarget?如何管理固定流水線狀態RasterState的?

7.材質管理系統是如何運作的(通常都是technique + multipass),如何併入管線的,如何從理論上保證可以實現各式各樣的效果的?如何抽象兼容固定和可編程流水線的? 如果是抽象管理的,如何抽象掉不同的technique下的不同的數據?管線裏是否有獨立的後期效果,還是用材質表達出來?材質是否可以腳本化?材質是要分組的,排序的代碼段在哪個cpp的哪裏?

8.特效如粒子系統到最後是使用哪個DrawXXX畫出來的? 粒子系統是動態公式計算(不要理會具體公式)還是幀動畫?

9.界面2D Texture Draw是如何被支持的?文字渲染是如何被支持的,特別是如何支持中文的,字體資源如何被管理?是否使用Freetype,是否支持東亞文字?

10.物理系統的接口是如何定義引擎的需求的?或者就是亂糟糟地直接用上.

轉自: http://www.cnitblog.com/linghuye/archive/2009/11/29/62870.html
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章