【问题标题】:How can I offload Object3d.toJSON() operation to a web worker?如何将 Object3d.toJSON() 操作卸载到网络工作者?
【发布时间】:2017-09-27 03:45:22
【问题描述】:

我需要将threejs中的活动场景转换为json对象。但是随着模型变得越来越大,这个过程需要越来越多的时间。我什至无法显示相同的进度条。我尝试将threejs场景发送给网络工作者,并在工作者处将其转换为json。但我无法将场景对象发送给工作人员。是否可以将threejs场景发送给网络工作者?或者Object3d.toJSON() 是否有任何基于承诺的实现?

【问题讨论】:

  • 基于承诺的解决方案对您没有帮助,它只会延迟 elsewhen(原文如此)。我建议改写您的问题:“我怎样才能将Object3d.toJSON 操作卸载给网络工作者或将其分解为更小的部分,以便浏览器在发生时保持响应?”
  • @T.JCrowder,如何在不将场景对象发送给工作人员的情况下将场景转换为 json?在这里我无法将场景对象发送给工作人员?你能推荐一些方法吗?

标签: javascript three.js


【解决方案1】:

是否可以将threejs场景发送给web worker?

不是真的。与工作人员的数据交换仅限于 ArrayBuffers 以及可以使用结构化克隆算法复制的任何内容。很可能,它甚至不适用于像 THREE.Scene 对象这样的东西。但是,无论您尝试什么,都需要执行与 toJSON() 相同复杂性顺序的操作才能将所有内容都放入 Worker。

或者 Object3d.toJSON() 是否有任何基于 Promise 的实现?

不幸的是,没有任何东西可以让它以一种不会阻塞 UI 线程的方式运行,无论它需要多长时间。

但您可以查看大部分时间消耗的确切内容 (do you have huge texture-images maybe?),并通过使用替代版本覆盖 THREE.Whatever.prototype.toJSON() 找到一种对这些内容进行局部优化的方法。

【讨论】:

  • 是的,我有一些巨大的纹理。我正在尝试修改 toJSON() 以避免将图像导出为 json。 ;) 感谢您的回复。
最近更新 更多