1. 背景
最近在做元宇宙/数字孪生相关的探索项目,尝试使用Android ARCore
展示一些3D模型,ARCore的模型加载和增强图像等功能在做数字现实交互方面体验还不错。
2. 加载问题
项目采用3d max生成建模模型,最开始使用ifc
格式,Web端在three.js
中加载正常。后来将模型转成gltf
格式,加载略慢一些但也能正常使用。移动端基于Android开发,使用到sceneform做模型加载和AR交互。
模型转成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库的编译时参数。核心问题还是模型比较大,渲染时使用的内存超过了这里的buffer限制,因此有两种解法:
- 将
FILAMENT_PER_FRAME_COMMANDS_SIZE_IN_MB
参数调大,从1MB改到3~4MB,再重新编译依赖。(这里暂时还没有尝试) - 将模型文件进行优化压缩,减少模型渲染的复杂度。
这里介绍些第二个方法。也很简单,有工具帮我们进行优化:gltfpack,我们可以通过npm安装或者下载release包,执行优化命令:
gltfpack -i scene.gltf -o scene.glb
在默认参数下,我的gltf文件从80MB优化到了30MB,经过尝试已经能正常在安卓app中加载。这个工具还提供了一些优化选项,可以支持更高压缩比的优化。