2016-08-02 70 views
7

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

有什么方法可以对WebGL函数进行基准测试吗?

回答

3

由于存在大量的上下文并且它们非常具有GPU特性,因此很难对着色器进行基准测试。

你也许可以说,如果一个着色器是由之前和绘图一堆东西与着色器(几千到万元绘制调用),然后通过调用gl.readPixels拖延GPU后使用performance.now比另一个更快。它会告诉你哪个更快。它不会告诉你它们有多快,因为拖延GPU包括启动和停止时间。

想想一辆赛车。对于一个拖拉机,你需要时间加速到目标。对于赛车来说,你需要一圈时间全速前进。在进行计时前,你先让车先行一圈,然后在第二圈前完成,汽车越过起跑线,全速行驶,终点线也全速前进。所以,你可以获得赛车的速度,而对于dragster你可以获得加速(与GPU通常无关,因为如果你想提高速度,你绝对不应该启动和停止)。

在不增加开始/停止时间的情况下,另一种时间的方法是在​​帧之间绘制一束。继续增加金额,直到帧之间的时间跳出整个帧。然后比较着色器之间的数量。

虽然在实际使用中还存在其他问题。例如,平铺的GPU(如许多移动设备上的PowerVR)尝试剔除将被透支的部分基元。所以在非平铺GPU上大量渲染的重阴影可能在平铺GPU上速度很快。

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

另见WebGL/OpenGL: comparing the performance

2

有没有办法得到准确的着色器的执行时间,而不也许有些GPU供应商特定的工具。然而,除了gman的建议之外,还有EXT_disjoint_timer_query扩展,它允许测量绘图调用的执行时间,这在很大程度上取决于着色器执行时间,特别是当着色器很重时(因此大部分时间GPU花费在执行上画电话)。

+0

'EXT_disjoint_timer_query'不会给你像PowerVR(iOS)这样的平铺架构的有用信息,因为它们使用了延迟渲染器,他们可以做的最好的事情就是在所有多边形被拆分后给出整个帧的时间,在瓷砖,遮挡修剪,瓷砖全部渲染等。https://imgtec.com/blog/a-look-at-the-powervr-graphics-architecture-tile-based-rendering/ – gman

+0

@gman是的。但是,我们正在讨论**着色器**基准测试。情况给了TBDR生命不安的机会,从而获得了一定程度的适当结果。我错了吗?从未测试过这个假设。 –

+0

但是,你能吗?我猜只要你打开混合,你至少可以知道一个着色器是否比另一个更快。混合所有透支将被扑灭。你只需要记住你回来的时间包括所有的多边形分割,瓦片分流等,所以它不仅仅是你着色器的时间。我想这也假设扩展架构上存在扩展,以及它实际返回的结果。 – gman