Merge 使用WebWorker合并几何图形?

Merge 使用WebWorker合并几何图形?,merge,geometry,three.js,web-worker,Merge,Geometry,Three.js,Web Worker,有人知道是否有可能在web worker中合并一组立方体几何体并将其传递回主线程吗?我认为这可以减少合并大量多维数据集时的延迟 Three.JS在web worker中可以正常工作吗?如果可以的话,是否可以(更快)这样做?不确定将几何体传回是否需要与正常合并几何体一样长的时间 目前,我正在使用定时for循环来减少延迟: // This array is populated by the server and contains the chunk position and data (which

有人知道是否有可能在web worker中合并一组立方体几何体并将其传递回主线程吗?我认为这可以减少合并大量多维数据集时的延迟

Three.JS在web worker中可以正常工作吗?如果可以的话,是否可以(更快)这样做?不确定将几何体传回是否需要与正常合并几何体一样长的时间

目前,我正在使用定时for循环来减少延迟:

// This array is populated by the server and contains the chunk position and data (which I do nothing with yet).
var sectionData = data.secData;

var section = 0;
var tick = function() {
    var start = new Date().getTime();
    for (; section < sectionData.length && (new Date().getTime()) - start < 1; section++) {
        var sectionXPos = sectionData[section][0] * 10;
        var sectionZPos = sectionData[section][1] * 10;
        var combinedGeometry = new THREE.Geometry();

        for (var layer = 0; layer < 1; layer++) { // Only 1 layer because of the lag...
            for (var x = 0; x < 10; x++) {
                for (var z = 0; z < 10; z++) {
                    blockMesh.position.set(x-4.5, layer-.5, z-4.5);
                    blockMesh.updateMatrix();
                    THREE.GeometryUtils.merge(combinedGeometry, blockMesh);
                }
            }
        }

        var sectionMesh = new THREE.Mesh(combinedGeometry, grassBlockMat);
        sectionMesh.position.set(sectionXPos, 0, sectionZPos);
        sectionMesh.matrixAutoUpdate = false;
        sectionMesh.updateMatrix();
        scene.add(sectionMesh);
    }
    if (section < sectionData.length) {
        setTimeout(tick, 25);
    }
};
setTimeout(tick, 25);
//此数组由服务器填充,并包含块位置和数据(我还没有对其进行任何处理)。
var sectionData=data.secData;
var段=0;
var tick=函数(){
var start=new Date().getTime();
对于(;section
使用Three.JS rev59-dev

合并的立方体以块的形式组成地形,目前(由于滞后),每个块只有一层


任何提示都将不胜感激!谢谢。

THREE.JS不会在web worker中工作,但是您可以复制库中需要在主线程和web worker中工作的部分

第一个问题是无法将几何体对象本身发送回主线程

由于web worker onmessage变量传递仅通过发送JSON副本(而不是javascript对象)或对ArrayBuffers的引用来工作,因此必须将几何体解码到每个浮点,将其打包到ArrayBuffer中,然后将引用发送回主线程

请注意,这些被称为可转移对象,一旦发送,它们将在其来源的webworker/主线程中清除

有关更多详细信息,请参见此处:

以下是将位置顶点打包到物理类型系统的数组中的示例:

//length * 3 axes * 4 bytes per vertex
var posBuffer = new Float32Array(new ArrayBuffer(len * 3 * 4));

//in a loop

//... do hard work

posBuffer[i * 3] = pos.x; //pos is a threejs vector
posBuffer[i * 3 + 1] = pos.y;
posBuffer[i * 3 + 2] = pos.z;

//after loop send buffer to main thread
self.postMessage({posBuffer:posBuffer}, [posBuffer.buffer]);
我在我的web worker中复制了THREE.JS vector类,并删除了所有我不需要的方法来保持它的良好和精简

仅供参考,速度不慢,对于n体碰撞之类的情况,效果很好


主线程向web worker发送一个命令,告诉它运行更新,然后侦听响应。有点像常规线程中的生产者-消费者模型。

好吧,所以我发现合并几何体占用了我程序的生命,占用了33%的CPU使用率。我真正需要的是用应用的矩阵更新Vertices,并通过将merge方法复制到我的代码中并切掉所有我不需要的部分,将其降低到4-7%。比使用网络工作者痛苦得多。谢谢Matt!在尝试你下面的答案之前,我会试一试。我从未想过合并可能会做其他不必要的事情。最确定的是,如果你只需要添加更多带有默认法线、UV和其他无意义的垂直。。。在我的例子中,它是在更新几何体,因此重新创建几何体数组甚至有些过分。为我工作,将我需要的部分内联到我自己的更新方法中,现在它正在运行…threejs现在在webworkers中工作。他们删除了对窗口对象的所有引用。啊,对不起,你是对的。我一直在试图发回几何图形时遇到问题。不过,我可以发送点(矢量2)。不确定这是怎么回事,但在web worker中解析JSON以获取点数据并将其发送回去确实大大缩短了加载时间,大约是原来的两倍。我希望我能发回几何图形!