如何处理worker中的THREE.Mesh对象

时间:2016-05-20 12:41:50

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

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

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

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

  

错误: buildingTileProcessor.js:332未捕获DataCloneError:无法在'DedicatedWorkerGlobalScope'上执行'postMessage':无法克隆对象。

经过一些研究后,我猜这种对象(THREE.Mesh)是复杂的数据克隆算法。

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

Parallel.js 的外观如何。该库还使用Web worker技术。

1 个答案:

答案 0 :(得分:0)

您无法将WebWorker范围/线程中的此类对象发送回主范围/线程。您可以在此here找到更多信息:

  

<强> aMessage

     

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

     

transferList Optional

     

arrayTransferableMessagePort个对象,用于转让所有权。如果对象的所有权被转移,则它在发送的上下文中变得不可用(绝育),并且仅对发送给它的工作人员可用。

     

只能传输ArrayBufferHere you can read about the structured clone algorithm个对象。 null不是transferList的可接受值。

transferable objects

无法使用结构化克隆的内容中,您会找到错误的原因。

我尝试做类似的事情并且不再使用网络工作者。如果你找到一些解决方法,我会很高兴听到它。

注意:您可以创建THREE.BufferGeometry,然后将缓冲区属性the fromGeometry method发送回主线程。这在技术上是可行的,但是它将有很多自定义代码才能使其正常工作。

更新

在此处作为对您评论的回复更新:

如果您使用the buffer arrays from the buffer attributes (THREE.BufferAttribute) of the buffer geometryTHREE.Geometry转换为THREE.BufferGeometry,则无法直接将缓冲区几何图形作为可转让格式发送,但您应该可以发送http://www.rubyist.net/~slagell/ruby/globalvars.html作为转让广告素材然后,您可以使用从消息中的worker接收的缓冲区数组重建主线程中的缓冲区属性和缓冲区几何。

我没有测试过这个,但它在技术上应该是可行的。

,这听起来值得一个实验。你可以获得多少性能提升,但这听起来值得一试。

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;