【问题标题】:Is it possible to measure rendering time in webgl using gl.finish()?是否可以使用 gl.finish() 在 webgl 中测量渲染时间?
【发布时间】:2013-12-27 09:40:38
【问题描述】:

我正在尝试测量加载 webgl 中的图像所需的时间。

我正在考虑使用 gl.finish() 来获取图像加载前后的时间戳,然后将两者相减以获得准确的测量值,但是我找不到这种用法的好例子。

这种事情可能吗,如果可以,有人可以提供示例代码吗?

【问题讨论】:

  • 你有一个大致的想法,所以这样做......这就是你在 Javascript 中获取时间戳的方式new Date().getTime();
  • 相关问题...这是threejs或其他框架和示例用来显示FPS的机制(gl.finish)吗?
  • 最好使用分析器,因为某些实现会忽略这些调用

标签: javascript opengl-es webgl


【解决方案1】:

现在可以使用 EXT_disjoint_timer_query_webgl2 扩展来计时 WebGL2 执行。

const ext = gl.getExtension('EXT_disjoint_timer_query_webgl2');
const query = gl.createQuery();
gl.beginQuery(ext.TIME_ELAPSED_EXT, query);
/* gl.draw*, etc */
gl.endQuery(ext.TIME_ELAPSED_EXT);

然后,稍后,您可以获得查询的经过时间:

const available = this.gl.getQueryParameter(query, this.gl.QUERY_RESULT_AVAILABLE);
if (available) {
    const elapsedNanos = gl.getQueryParameter(query, gl.QUERY_RESULT);
}

需要注意的几点:

  • 一次只能进行一个计时查询。
  • 结果可能异步可用。如果每帧有多个时间调用,则可以考虑使用查询池。

【讨论】:

    【解决方案2】:

    不,不是。

    实际上在 Chrome 中gl.finish 只是一个gl.flushSee the code 并搜索“::finish”。

    因为 Chrome 是多进程并且实际上深度实现了安全性,实际的 GL 调用是在另一个进程中从您的 JavaScript 发出的,所以即使 Chrome 确实调用了gl.finish,它也会在另一个进程中发生,并且从 JavaScript 的 POV 不会以任何形状或形式准确计时。出于类似的原因,Firefox 显然正在做类似的事情。

    即使在 Chrome 之外,每个驱动程序处理 gl.finish 的方式也不同。使用gl.finish 进行计时并不是有用的信息,因为它不代表实际速度,因为它包括停止 GPU 管道。换句话说,gl.finish 的计时包含大量实际使用中不会发生的开销,因此不能准确衡量正常情况下执行速度的速度。

    在某些 GPU 上有 GL 扩展来获取计时信息。不幸的是,它们 (a) 在 WebGL 中不可用,并且 (b) 不可能永远可用,因为它们不具备便携性,因为它们不能真正在许多手机中的平铺 GPU 上工作。

    而不是询问如何为 GL 调用计时,您具体想通过计时来实现什么?也许人们可以提出解决方案。

    【讨论】:

    • 我实际上只是对时间感兴趣,因为我试图根据渲染时间对客户端进行指纹识别。有没有其他的 webgl 事件计时解决方案?
    • 也许可以考虑 requestAnimationFrame 事件之间的时间调用。如果时间太长,那就少画。抱歉,我不知道一个很好的例子。
    【解决方案3】:

    作为基于客户端的 WebGL 事件计时取决于客户端计算机的当前加载(CPU 加载)、GPU 加载以及客户端本身的实现。一种粗略估计的方法是使用XmlHttpRequest (http://en.wikipedia.org/wiki/XMLHttpRequest) 测量从服务器到客户端的往返延迟。通过查找服务器测量时间到本地时间的延迟,可以获得可能的负载度量。

    【讨论】:

    • 如何使用 XmlHttpRequest 来包含图片加载的实际时间? (我看到了一些叫做 onload() 但不确定它的相关性......)。你能提供一些示例代码吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多