路況3D即時顯示
看到這個小顯示屏了嗎? 上面是3D渲染的前方道路交通實況。
這種3D路況畫面可以過濾掉不重要的道路交通資訊,只呈現對司機最重要的資訊,可以有效減輕司機的認知負擔。
這個小顯示屏採用了ARM CPU和GPU,操作系統是一個高度裁剪過的Android系統。 在這樣一個小巧的系統上,要運行Unity之類的大型3D遊戲引擎是不太可能的,而自己用OpenGL ES擼一個好用的3D渲染引擎又太費時,經過充分調研和測試,我們最終選擇了Godot引擎。
選擇Godot引擎的主要理由是:
1. 寬鬆的開源協定。 Godot引擎的原始程式碼採用MIT協定發佈,這意味著我們可以在商業專案中免費使用Godot Engine,並且可以自由地修改Godot的原始程式碼,將其移植到我們自己的硬體平臺上。 這個需求用Unity之類的閉源遊戲引擎肯定是不行的。
其實我們最初的原型是用Unity開發的,後來因為無法移植而放棄了Unity,所以說還是開源軟體好。
2. 所見即所得的開發環境。我們也嘗試過OGRE等其他3D遊戲引擎,但是它們都沒有Godot這樣強大而好用的開發工具,你只能用代碼來構造場景,這樣效率就很低。而Godot提供了和Unity類似的開發體驗,直接把模型、光源、攝像機拖進場景,再設置參數就可以了,隨時可以看到渲染效果,搭建場景非常方便。
3. 自帶的GUI控制項非常好用。
Godot原本是個2D遊戲引擎,所以天然地對2D渲染有著良好的支持。它自帶了幾十種GUI控制項,直接拖到場景中去,就可以迅速構造出一個2D交互介面,對於熟悉Xcode和Qt的人來說很容易上手。
實際上Godot引擎的開發環境(Editor)就是用Godot自己的GUI控制項搭起來的,這一點是非常厲害的。相比之下,Unity的GUI工具就沒有這麼簡便了。
4. 一鍵匯出到目標平臺的能力。我們在電腦上開發3D遊戲,在電腦上測試OK之後,直接一鍵匯出project,然後把匯出的檔拷貝到我們的嵌入式設備上就可以使用了,渲染效果和電腦上一模一樣,省去了適配不同平臺的麻煩。
但是不得不說,Godot也有一些不足:
1. 渲染性能不如Unity。
當我們的模型總面數達到30萬的時候,Unity仍可以渲染60幀,而Godot只能渲染不到30幀。
經過分析,Unity主要採用Deferred rendering,並且在一次Draw Call中渲染盡可能多的物體(比如所有GUI控制項可以在一個Draw Call內渲染完),以減少Draw Call。 而Godot採用了不同的思路,它通過調整渲染順序,盡可能減少shader change。 兩種方式各有千秋,但就目前來說,Unity的渲染性能更勝一籌,希望Godot加油啊。
2. 對嵌入式GPU的抗鋸齒支援不太好。
在開發AI防碰儀的早期階段,當時 Godot 的最新版本為 3.1,這個版本對 MSAA 抗鋸齒的支援非常有限。 具體來說,就是不支援OpenGL ES 2.0的MSAA擴展。
而我們的Mali-400 GPU偏偏只支援OpenGL ES 2.0,這就用不了MSAA了嗎? 也不是,幸好Godot是一個比較活躍的開源軟體,在Github上有人為Godot貢獻了OpenGL ES 2.0的MSAA補丁。 我們在合併這個補丁之後又做了一些修改,就可以啟用MSAA了,渲染品質瞬間提升了一截。
現在Godot已經發佈了3.2版本,這個版本是支援在OpenGL ES 2.0上啟用MSAA的,大家可以放心使用。