1. 背景
最近在做元宇宙/數(shù)字孿生相關(guān)的探索項目,嘗試使用Android ARCore展示一些3D模型,ARCore的模型加載和增強圖像等功能在做數(shù)字現(xiàn)實交互方面體驗還不錯。
2. 加載問題
項目采用3d max生成建模模型,最開始使用ifc格式,Web端在three.js中加載正常。后來將模型轉(zhuǎn)成gltf格式,加載略慢一些但也能正常使用。移動端基于Android開發(fā),使用到sceneform做模型加載和AR交互。
模型轉(zhuǎn)成gltf格式后,gltf文件+bin文件總大小大約80MB左右,采用異步加載,點擊plane進行渲染。但在渲染模型時程序crash,Logcat錯誤信息如下:
Command Stream Overflow.
FILAMENT_PER_FRAME_COMMANDS_SIZE_IN_MB is limited to 1MB
3. 解決方式
sceneform底層依賴了Google filament 庫,FILAMENT_PER_FRAME_COMMANDS_SIZE_IN_MB 就是filament庫的編譯時參數(shù)。核心問題還是模型比較大,渲染時使用的內(nèi)存超過了這里的buffer限制,因此有兩種解法:
- 將
FILAMENT_PER_FRAME_COMMANDS_SIZE_IN_MB參數(shù)調(diào)大,從1MB改到3~4MB,再重新編譯依賴。(這里暫時還沒有嘗試) - 將模型文件進行優(yōu)化壓縮,減少模型渲染的復雜度。
這里介紹些第二個方法。也很簡單,有工具幫我們進行優(yōu)化:gltfpack,我們可以通過npm安裝或者下載release包,執(zhí)行優(yōu)化命令:
gltfpack -i scene.gltf -o scene.glb
在默認參數(shù)下,我的gltf文件從80MB優(yōu)化到了30MB,經(jīng)過嘗試已經(jīng)能正常在安卓app中加載。這個工具還提供了一些優(yōu)化選項,可以支持更高壓縮比的優(yōu)化。