我在 three.js 中创建了一些建筑物。它到目前为止有效。
基于单线程的缺点,我寻找处理大量数据的替代方案。 因此,我创建了一个web-worker来构建我的几何体并将其发送回主线程。
但它不起作用我收到以下错误消息:
错误: buildingTileProcessor.js:332未捕获DataCloneError:无法在'DedicatedWorkerGlobalScope'上执行'postMessage':无法克隆对象。
经过一些研究后,我猜这种对象(THREE.Mesh
)是复杂的数据克隆算法。
有人认出这个问题吗? 如何发回我的Mesh对象?
Parallel.js 的外观如何。该库还使用Web worker技术。
答案 0 :(得分:0)
您无法将WebWorker
范围/线程中的此类对象发送回主范围/线程。您可以在此here找到更多信息:
<强> aMessage 强>
交付给工人的对象;这将在传递给DedicatedWorkerGlobalScope.onmessage处理程序的事件的数据字段中。这可以是structured clone algorithm处理的任何值或JavaScript对象,其中包括循环引用。
transferList
Optional
array个Transferable个MessagePort个对象,用于转让所有权。如果对象的所有权被转移,则它在发送的上下文中变得不可用(绝育),并且仅对发送给它的工作人员可用。
只能传输ArrayBuffer和Here you can read about the structured clone algorithm个对象。 null不是transferList的可接受值。
在无法使用结构化克隆的内容中,您会找到错误的原因。
我尝试做类似的事情并且不再使用网络工作者。如果你找到一些解决方法,我会很高兴听到它。
注意:您可以创建THREE.BufferGeometry
,然后将缓冲区属性the fromGeometry
method发送回主线程。这在技术上是可行的,但是它将有很多自定义代码才能使其正常工作。
在此处作为对您评论的回复更新:
如果您使用the buffer arrays from the buffer attributes (THREE.BufferAttribute
) of the buffer geometry将THREE.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;