首页 > 解决方案 > 有没有办法使用异步函数将数据(缓冲区数据)并行传递给 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);            
 }

标签: webgl

解决方案


他们会一一转让。

规格页 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 仅表示在将回调添加到事件列表之前存在延迟。


推荐阅读