gil*_*ads 7 javascript opengl-es webgl
我正在尝试测量webgl中加载图像所需的时间.
我正在考虑使用gl.finish()来获取图像加载前后的时间戳,并减去两者以获得准确的测量值,但是我找不到这种用法的好例子.
这种事情是否可行,若有人能提供示例代码?
现在可以使用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);
Run Code Online (Sandbox Code Playgroud)
然后稍后,您可以获得查询的经过时间:
const available = this.gl.getQueryParameter(query, this.gl.QUERY_RESULT_AVAILABLE);
if (available) {
const elapsedNanos = gl.getQueryParameter(query, gl.QUERY_RESULT);
}
Run Code Online (Sandbox Code Playgroud)
有几点需要注意:
不它不是.
事实上在Chrome gl.finish
中只是一个gl.flush
.查看代码并搜索":: 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调用你想要通过计时来实现什么?也许人们可以建议解决方案.
归档时间: |
|
查看次数: |
1415 次 |
最近记录: |