readPixels性能,是什么使它如此缓慢?

时间:2019-01-07 14:20:22

标签: javascript webgl

当尝试对大量数据进行命中测试(但几乎没有任何内容显示在屏幕上)时,即使帧时间低于16.7ms(全10ms),读取像素的速度也确实很慢

我正在运行在webgl中的datavis平台,但令我感到困惑的是为什么readpixels这么慢。我们正在使用拾色方法对被拖动的项目进行命中测试,以便可以将其放到其他物体上。尽管渲染(未读取)为60fps,但上传到场景中的数据越多,花费的时间越长。它只拉出一个像素,因此显然与它的遮挡方面有关,但是为什么要花比帧时间长四倍的时间?

if (xPos >= 0 && yPos >= 0 && xPos < drawBufferWidth && yPos < drawBufferHeight) {
   gl.readPixels(xPos, yPos, 1, 1, gl.RGBA, gl.UNSIGNED_BYTE, lastCapturedColourMap);
}

我希望帧速率越高,读取像素的成本越低,但这似乎是固定成本。谁能启发我?我正在寻找可能对它真正变慢的人或对webgl中2d图形的任何其他替代命中测试方法了解得更多的人

enter image description here

1 个答案:

答案 0 :(得分:1)

正如mlkn所指出的,它很慢,因为WebGL是流水线的。为了安全起见,它在Chrome中经过双重管道处理。

您从JavaScript发出了webgl命令。该命令被复制到命令缓冲区。另一个过程是GPU进程读取该命令,它会验证您没有做错什么,然后调用一些相应的GL函数,该函数将命令写入驱动程序的命令缓冲区。另一个进程读取该命令。

通常情况下,所有这些都是并行运行的。在发布新命令时,GPU进程将读取先前的命令并将其传递给GL。在GPU进程发出命令的同时,GPU和GPU驱动程序在此之前无法处理先前的命令。

在您尝试读取时,尽管所有并行运行的进程都必须停止,并且所有进程都必须等待所有命令处理,才能读取像素(已发出的所有命令的结果)到目前为止),然后将其传回。然后它们都必须重新启动,但是此时所有命令列表都为空,因此将需要几个命令来再次给所有它们并行执行的操作。