是否可以使用gl.finish()在webgl中测量渲染时间?

问题描述 投票:7回答:3

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

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

这种事情是否可行,若有人能提供示例代码?

javascript opengl-es webgl
3个回答
5
投票

不它不是。

实际上在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调用你想要通过计时来实现什么?也许人们可以建议解决方案。


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);
}

有几点需要注意:

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

-4
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.