webgl - 有没有办法使用异步函数将数据(缓冲区数据)并行传递给 gpu?
问题描述
我正在尝试使用 gl.BufferData() 命令在并行包装 setTimeout 函数中将数据从 cpu 传递到 gpu。假设我调用setTimeout(()=>gl.BufferData(i),1) 4 次,命令是并行传输数据还是一个接一个传输数据。理想情况下,我正在尝试加快从 cpu 到 gpu 的数据传输。
我开始知道 webgl 调用不能用 cpu 计时器计时。
createBuffers(4);
for(let i=0; i< 4; i++){
setTimeout(function(){
bufferIndex = i;
copyDataToBuffer(bufferIndex,attributeIndex)//Can this be done in parallel
},1);
attributeIndex++;
}
for(let i=0; i< 4; i++){
renderBuffer(i);
}
解决方案
他们会一一转让。
从规格页 4
命令总是按照接收到的顺序处理
我还认为您可能对 JavaScript 和 setTimeout 的工作方式有错误的看法。除了worker , JavaScript 永远不会并行运行。
它像这样工作
for (;;) {
sleep-Until-events
while(listOfEvents.length) {
const event = listOfEvents.shift();
callEventHandlersForEvent(event);
}
}
而已。当您调用 setTimeout 时,事件被添加到 listOfEvents 中,或者更确切地说,在幕后创建了一个计时器,当时间结束时,您的回调被添加到要运行的事件列表中。其他事件包括 requestAnimationFrame、mousedown、keydown、XHR 完成、图像加载等,
他们所做的只是添加到listOfEvents
这些事件中,这些事件被连续调用。JavaScript 不会并行运行。
其他不在 JavaScript 中的事情确实并行运行,例如下载文件、解码图像等,但是当它们最终到达 JavaScript 时,所发生的只是一个事件被添加到事件列表中,并且这些事件被串行处理。
因此,有效地调用 setTimeout 4 次,超时时间为 0,只需将 4 个函数添加到事件列表中。然后,一次一个,每个都被调用。将 timeout > 0 仅表示在将回调添加到事件列表之前存在延迟。