一直很想研究下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幀率了,但是取而代之的就是降低了畫質,至於其他優化方案。有時間我再實現下吧。