使用addImage()和会话

时间:2019-06-01 00:26:26

标签: android arcore

我使用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()不起作用,如何在运行时添加图像?

1 个答案:

答案 0 :(得分:0)

我最终从com.google.ar.sceneform.ux:sceneform-ux重写了BaseArFragment,以开始在后台线程中加载图像的会话。相机视图现在大约1秒钟后开始,但是UI线程未被阻止。我还调整了用作标记的图像的大小,使其宽度和高度均小于1k px,从而使加载速度更快。我相信图片可能会更小,如文档所述:

  
      
  • 图片的分辨率应至少为300 x 300像素。
  •   
  • 使用高分辨率的图像不会提高性能。
  •   

将来,我将考虑将片段保留在堆栈中,但是更改标记仍将需要重新加载整个会话。