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

时间:2016-08-02 00:42:59

标签: javascript webgl benchmarking

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

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

2 个答案:

答案 0 :(得分:3)

对着色器进行基准测试非常困难,因为它有大量的上下文,并且它们非常具有GPU特性。

你可以通过使用performance.now在使用该着色器绘制一堆东西之前和之后(几千到几百万个绘制调用)来判断一个着色器是否比另一个着色器更快,然后通过调用{来停止GPU {1}}。它会告诉你哪个更快。它不会告诉你它们有多快,因为拖延GPU包括启动和停止时间。

想想一辆赛车。对于一个高速赛车,你需要加速到达目的地。对于赛车,你需要一圈全速前进。你让赛车在计时之前先跑一圈,你在第二圈的时间,车越过起跑线全速前进,终点线全速前进。所以,你得到了汽车的速度,你可以得到它的加速度(与GPU无关,因为如果你想要速度,你就不应该开始和停止它们。)

另一种不添加开始/停止时间的时间方法是在gl.readPixels帧之间绘制一堆。继续增加数量,直到帧之间的时间跳起整帧。然后比较着色器之间的数量。

在实际使用中还有其他问题。例如,平铺GPU(如许多移动设备上的PowerVR)试图剔除将要透支的基本部分。因此,在非平铺GPU上进行大量过度绘制的重型着色器在平铺GPU上可能会非常快。

还要确保你正确的时机。如果你正在计算一个顶点着色器,你可能想要使你的画布1x1像素,你的片段着色器尽可能简单,并在一次绘制调用中传递很多顶点(以消除调用时间)。如果您正在对片段着色器进行计时,那么您可能需要一个大画布和一组包含几个完整画布四边形的顶点。

另见WebGL/OpenGL: comparing the performance

答案 1 :(得分:2)

如果没有某些GPU供应商专用工具,就无法获得精确的着色器执行时间。但是,除了gman的建议外,还有EXT_disjoint_timer_query扩展,可以测量绘制调用的执行时间,这在很大程度上取决于着色器执行时间,尤其是当着色器是非常沉重(因此占用了大部分时间GPU执行你的绘制调用)。