我使用ArFragment
中的com.google.ar.sceneform.ux:sceneform-ux:1.9.0
构建了应用程序。我添加了重新创建显示片段的导航。但是创建ArFragment
会持续很长时间。
首先,我看到方法addImage()
花费了大部分时间。在文档中可以找到:
注意:对于5MB字节的输入流,此方法大约需要10-20ms。跑 如果这会影响您的应用程序,则将其放在后台线程中。
但是当我搬家时:
augmentedImageDatabase.addImage(DEFAULT_IMAGE_NAME, augmentedImageBitmap)
到另一个线程以异步方式运行它时,ArCore停止了识别或检测此标记。
然后我认为也许我应该存储AugmentedImageDatabase
并重新使用它。但是这样的数据库构造函数使用session
,所以我想每次都必须重新创建数据库。
我最终调整图像大小以加快处理速度。
分析后,我发现第二个缓慢的事情是创建会话。是否有可能重用会话?我发现从BaseArFragment
保存它是不可能的,因为创建会话的所有方法都是私有的。
我应该自己实现BaseArFragment
以获得更好的性能,还是应该始终将ArFragment实例保留在Fragment Back Stack中并仅用其他视图覆盖它?如果后台线程中的addImage()
不起作用,如何在运行时添加图像?
答案 0 :(得分:0)
我最终从com.google.ar.sceneform.ux:sceneform-ux
重写了BaseArFragment,以开始在后台线程中加载图像的会话。相机视图现在大约1秒钟后开始,但是UI线程未被阻止。我还调整了用作标记的图像的大小,使其宽度和高度均小于1k px,从而使加载速度更快。我相信图片可能会更小,如文档所述:
- 图片的分辨率应至少为300 x 300像素。
- 使用高分辨率的图像不会提高性能。
将来,我将考虑将片段保留在堆栈中,但是更改标记仍将需要重新加载整个会话。