Filament初探,全場景效能測試
阿新 • • 發佈:2020-12-22
一直很想研究下Filament在移動端全場景(大約20萬Triangle,約120個渲染實體)的實時幀率。終於在今天有時間騰出來研究下Filament在Android上的全場景PBR渲染效能。
這裡以java介面進行測試(暫時還沒測試c/c++原生api在Android上的效能),以Filament官方提供的測試案例:sample-gltf-viewer。我們下載GLTF官網提供的測試模型:https://github.com/KhronosGroup/glTF-Sample-Models/tree/master/2.0/Sponza進行測試。
預設下,Filament的視錐近截面比較前,我們設定小一點,如下:
inner class SurfaceCallback : UiHelper.RendererCallback { override fun onNativeWindowChanged(surface: Surface) { } override fun onDetachedFromSurface() { } override fun onResized(width: Int, height: Int) { val aspect = width.toDouble() / height.toDouble() Log.i("MyLog", "onResized"); modelViewer.camera.setProjection(45.0, aspect, 0.01, 1000.0, Camera.Fov.VERTICAL) modelViewer.view.viewport = Viewport(0, 0, width, height) } }
接著,我們修改sample-gltf-viewer案例,加入一個幀計數器TextView,並把GLSurfaceView放到一個底層Layer上,佈局如下:
接著,我們把測試模型放入assets目錄下,然後修改載入的模型,然後使用一個ibl.ktx和sky.ktx作為間接光計算和天空盒。啟動App,效果如下:
可以看到這個幀率非常之低,預設下,Filament開啟了很多後處理和高階效果(比如ssao,vsm,抗鋸齒等等),我們關閉這些效果,如下:
然後,重新執行app,檢視效果如下:
這次幀率確實比之前提高了,但是仍然很低,為了保持60幀率,一種簡單的處理方式就是開啟動態解析度(dynamicResolution),縮放0.3-0.8,並同時開啟fxaa抗鋸齒,否則畫面非常之差。程式碼如下:
再次執行app,效果如下:
終於保持在60幀率了,但是取而代之的就是降低了畫質,至於其他優化方案。有時間我再實現下吧。