【问题标题】:How to handle THREE.Mesh objects in a worker如何在工作人员中处理 THREE.Mesh 对象
【发布时间】:2016-09-17 17:44:57
【问题描述】:

我在 three.js 中创建了一些建筑物。到目前为止它有效。

基于单线程的缺点,我寻找处理大量数据的替代方案。 因此,我创建了一个 web-worker 来构建我的几何图形并将其发送回主线程。

但它不起作用我收到以下错误消息:

错误:buildingTileProcessor.js:332 Uncaught DataCloneError:无法在“DedicatedWorkerGlobalScope”上执行“postMessage”:无法克隆对象。

经过一些研究,我猜这种对象 (THREE.Mesh) 对于数据克隆算法来说太复杂了。

有人知道这个问题吗? 如何发回我的 Mesh 对象?

Parallel.js 看起来如何。该库还使用了网络工作者技术。

【问题讨论】:

    标签: javascript multithreading three.js mesh web-worker


    【解决方案1】:

    您不能将此类对象从WebWorker 作用域/线程发送回您的主作用域/线程。您可以在此here 上找到更多信息:

    消息

    交付给工人的对象;这将在传递给DedicatedWorkerGlobalScope.onmessage 处理程序的事件的数据字段中。这可以是 structured clone algorithm 处理的任何值或 JavaScript 对象,包括循环引用。

    transferList Optional

    一个可选的array Transferable 对象转移所有权。如果一个对象的所有权被转移,它在发送它的上下文中变得不可用(中性),并且只对发送它的工作人员可用。

    只能传输 MessagePortArrayBuffer 对象。对于 transferList,null 不是可接受的值。

    Here you can read about the structured clone algorithm:

    无法使用结构化克隆的事物中,您可以找到错误的原因。

    我尝试做类似的事情并放弃使用网络工作者。如果你能找到一些工作,我很乐意听到。


    注意:您可以创建一个THREE.BufferGeometry,然后将缓冲区属性作为transferable objects 发送回主线程。这在技术上是可行的,但需要大量自定义代码才能使其正常工作。

    更新

    作为对您的评论的回应,更新:

    如果您使用the fromGeometry methodTHREE.Geometry 转换为THREE.BufferGeometry,则无法将缓冲区几何图形直接作为可传输对象发送,但您应该能够将the buffer arrays from the buffer attributes (THREE.BufferAttribute) of the buffer geometry 作为可传输对象发送,然后您可以重建缓冲区属性以及使用您在消息中从您的工作人员收到的缓冲区数组的主线程中的缓冲区几何。

    我尚未对此进行测试,但在技术上应该是可行的。我不知道这样可以提高多少性能,但听起来值得一试。

    var bufferGeometry = THREE.BufferGeometry().fromGeometry( geometry );    
    
    // Now you can access the buffer attributes that hold buffer arrays.
    // You can collect them using their name ( color, normal, position, etc )
    var attribute = bufferGeometry.getAttribute( name );
    var bufferArray = attribute.array;
    
    // The index attribute is accessible like this:
    var indexAttribute = bufferGeometry.getIndex();
    var indexArray = indexAttribute.array;
    

    【讨论】:

    • 感谢您的信息。关于你的笔记,我有一个 THREE.Mesh,它是一个带有顶点等的 javascript 对象结构。我读到我可以进行如下转换:var bufferGeometry = new THREE.BufferGeometry().fromGeometry( geometry); 结果我得到一个 BufferGeometry,它通过 Float32Arrays 存储 gl 数据。这个 BufferGeometry 是一种数组缓冲区吗?因为 arraybuffers 是可传输的对象......所以它应该可以将它发回
    • 好的,非常感谢您的努力。我会尝试一下,我会给出一些反馈......如果有人有其他方法来解决这个问题,我会很高兴听到它......
    猜你喜欢
    • 1970-01-01
    • 2021-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-02
    • 2017-04-08
    • 2017-03-02
    • 2013-01-18
    相关资源
    最近更新 更多