通常在移植既有引擎到新硬體上時,我都會先完成memory,file system以及OS相關部分的移植,然後才開始動繪圖部分。這次因為只需要移植繪圖部分,所以輕鬆了一些,不過取而代之的就是要先讀懂別人的程式碼並推測出整個系統架構。而繪圖部分通常我會從幾個步驟來逐步實作
- 初始化device
- 將device與OS原生context串接,這部分有時還挺麻煩的
- 建立frame buffers以及swap chain. 到了這一步,基本上就可以看到畫面了。在fixed function的硬體上,到這一步後其實就能draw primitive了。但是現代支援shader的硬體就比較麻煩了,還要很多步驟才能開始繪出東西。
- 實作vertex attribute layout以及vertex buffer
- 了解shader語言以及如何Compile and load shaders
- 實作貼圖的生成以及載入,到這一步才能開始測試draw primitive
理解硬體如何運作並實作其實並不難,看看文件以及範例其實就懂八九成了,真正麻煩的地方是要思考如何巧妙的把新的繪圖流程套到既有的系統架構上,讓系統可以跨平台執行,同時又不失效能,這部分就很需要經驗了,尤其是遇到架構大更新時(比如DX9進化到DX11)就更考驗功力了。這次Switch的原生繪圖API是類似Vulkan的架構,為的是減少driver的複雜程度以及負擔,而將大部分驗證以及command buffer、queue、記憶體等的管理工作都交由application來負責,藉此解決small batch的問題。也因為整個pipeline 完全不同了,要套用到原本的架構需要許多特別處理。
接下來兩個月大概都會忙這份工作而無法專心在新遊戲的開發上面,不過新遊戲的概念總算有些突破,接下來應該就可以花些時間來製作雛形了,不過恐怕就要犧牲些休息時間了。完成這份工作後,應該就可以投入更多的時間在新遊戲的開發上了吧。