1. 程式人生 > 實用技巧 >Filament初探,全場景效能測試

Filament初探,全場景效能測試

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