【问题标题】:Web workers for loading object in three.js用于在 three.js 中加载对象的 Web 工作者
【发布时间】:2018-02-06 21:04:38
【问题描述】:

我想使用 three.js 和相应的加载器(例如 PLYLoader)加载和解析 3D 文件。但是因为我的3D文件很大,所以Loader解析文件的时间比较长,把页面上所有基于JS的UI都锁死了。我想知道在不锁定 UI 的情况下加载文件的最佳方式是什么。

我想这个解决方案是基于网络工作者的。但是,我不确定最好的方法是什么。 Loaders 需要主 three.js 文件,该文件依次执行 DOM 操作。因此,我不能天真地将 Loader 功能复制到它自己的 web-worker 文件中。

我发现之前有人问过类似的问题。然而,答案似乎是专门针对纹理的,这似乎在 web-worker 的适用性方面存在差异。

Loading texture from Web Worker in Three.js

【问题讨论】:

    标签: javascript three.js web-worker


    【解决方案1】:

    您实际上可以将加载功能包含在 Web Worker 中。只需导入三个.js 和相应的加载器文件:

    myWorker.js
    ...
    importScripts('/path/to/js/three.js', '/path/to/js/threeXYZLoader.js');
    

    之后,您可以按照Three.js example. 中的说明加载对象 更棘手的部分是将加载的对象放回主线程以便进行渲染。以Worker.postMessage and Transferable object 为起点来看看这种方法。

    【讨论】:

    • OP 在他们的问题中指出,他们不能在 worker 中包含 three.js lib,因为它需要访问 DOM。你是说这实际上没有问题?
    • 是的,除非您创建渲染器和场景,否则这不是问题。只是为了使用加载器功能,您实际上可以包含 three.js 文件。我在我的应用程序中以相同的方式使用它。我还从 Web Worker 上下文中加载了我的模型,我可以确认这是可行的。
    • 事实证明,我使用的加载器出于某种原因执行了一些场景操作,这导致了 DOM 更新。我把你的建议搞砸了,我设法让它发挥作用。谢谢!
    • 正如 OP 所说,即使是对象加载器也需要访问 DOM,因为它们会生成用于加载纹理的图像元素
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-11-29
    • 2013-05-08
    • 2021-05-03
    • 1970-01-01
    • 2021-09-01
    • 1970-01-01
    • 2018-06-02
    相关资源
    最近更新 更多