【Android】Sceneform无法加载大型模型的解决办法

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限制,因此有两种解法:

  1. FILAMENT_PER_FRAME_COMMANDS_SIZE_IN_MB参数调大,从1MB改到3~4MB,再重新编译依赖。(这里暂时还没有尝试)
  2. 将模型文件进行优化压缩,减少模型渲染的复杂度。

这里介绍些第二个方法。也很简单,有工具帮我们进行优化:gltfpack,我们可以通过npm安装或者下载release包,执行优化命令:

gltfpack -i scene.gltf -o scene.glb

在默认参数下,我的gltf文件从80MB优化到了30MB,经过尝试已经能正常在安卓app中加载。这个工具还提供了一些优化选项,可以支持更高压缩比的优化。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容