如何对WebGL着色器进行基准测试?

Mai*_*tor 9 javascript benchmarking webgl

人们可以通过计算他在一秒钟内调用这些函数的次数来对常规JavaScript函数进行基准测试.但是,在WebGL上,诸如gl.drawArraysasync之类的函数,因此您无法通过对API调用进行基准测试来衡量着色器所需的时间.

有没有办法对WebGL功能进行基准测试?

gma*_*man 4

对着色器进行基准测试非常困难,因为存在大量上下文,而且它们非常特定于 GPU。

您可以通过使用performance.now该着色器绘制一堆内容之前和之后(几千到数百万次绘制调用)然后通过调用 来停止 GPU,从而判断一个着色器是否比另一个着色器更快gl.readPixels。它会告诉你哪个更快。它不会告诉您它们有多快,因为停止 GPU 包括启动和停止时间。

想想一辆赛车。对于高速赛车来说,您需要计算加速到目的地的时间。对于赛车,您需要全速跑一圈。你在计时前让车先跑一圈,你在第二圈计时,车全速冲过起跑线,终点线也全速冲过。因此,您可以获得汽车的速度,而对于高速赛车,您可以获得其加速度(通常与 GPU 无关,因为如果您追求速度,则永远不应该启动和停止它们)。

另一种不添加开始/停止时间的计时方法是在requestAnimationFrame帧之间绘制一堆。不断增加数量,直到帧之间的时间跳跃整个帧。然后比较着色器之间的数量。

但实际使用中还存在其他问题。例如,平铺 GPU(如许多移动设备上的 PowerVR)尝试剔除将透支的图元部分。因此,在非平铺 GPU 上进行大量透支的重型着色器在平铺 GPU 上可能会很快。

还要确保你选择了正确的时间。如果您正在为顶点着色器计时,您可能希望画布为 1x1 像素,并且片段着色器尽可能简单,并在一次绘制调用中传递大量顶点(以消除调用时间)。如果您正在为片段着色器计时,那么您可能需要一个大画布和一组包含多个完整画布四边形的顶点。

另请参阅WebGL/OpenGL:性能比较