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

标签 javascript webgl benchmarking

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

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

最佳答案

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

您可以通过使用 performance.now 来判断一个着色器是否比另一个着色器快通过调用 gl.readPixels 获取 GPU。它会告诉你哪个更快。它不会告诉您它们有多快,因为停止 GPU 包括开始和停止时间。

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

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

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

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

另见 WebGL/OpenGL: comparing the performance

关于javascript - 如何对 WebGL 着色器进行基准测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38710140/

相关文章:

java - 字符串池 : "Te" +"st" faster than "Test"?

javascript - 无法使用 onclick 功能在 div 中打开超链接

javascript - 当前显示在 <select> 框中的项目的索引

ajax - 通过 ajax 加载二进制 WebGL 模型的最佳方法?

apache - 如何在 Windows 中运行 Apache 基准负载测试?

Scala 2.10 基准测试 : generic methods from the collections are useless when performance is important?

javascript - 如果之前 DOM 元素中的部分旧内容达到了特定高度,则创建新的 DOM 元素

javascript - 无法让 document.execCommand ("copy")按预期工作

javascript - WebGL 中的多个程序不起作用

webgl - getShaderPrecisionFormat 返回值