Browser 如何在WebGL中计算渲染时间?看来我算错了

Browser 如何在WebGL中计算渲染时间?看来我算错了,browser,webgl,rendering,interactive,Browser,Webgl,Rendering,Interactive,我正在运行基于交互式浏览器的WebGL体绘制。当我进行交互时,使用鼠标调用函数drawVolume()。为了测量渲染时间,我在开始和结束时使用时间戳。这种差异给了我渲染时间。 目前我在两台机器上运行它:客户机和服务器 以下是观察结果: 服务器机器:[NVIDIA GeForce GTX970]渲染时间约小于2ms。互动更快 客户端机器:[NVIDIA Quadro K600]渲染时间约为10-11ms。交互显示较慢,帧更新较慢。有时显示器驱动器停止工作,显示器熄灭。我需要重新启动系统 我不知道这

我正在运行基于交互式浏览器的WebGL体绘制。当我进行交互时,使用鼠标调用函数drawVolume()。为了测量渲染时间,我在开始和结束时使用时间戳。这种差异给了我渲染时间。 目前我在两台机器上运行它:客户机和服务器

以下是观察结果:

服务器机器:[NVIDIA GeForce GTX970]渲染时间约小于2ms。互动更快

客户端机器:[NVIDIA Quadro K600]渲染时间约为10-11ms。交互显示较慢,帧更新较慢。有时显示器驱动器停止工作,显示器熄灭。我需要重新启动系统

我不知道这个方法是否适合计算渲染时间。不知何故,我觉得,尽管代码已经执行,但在硬件级别,渲染的图像还没有显示在浏览器窗口上。如何了解为相应交互更新的相应帧。如果我得到这个状态,那么也许我可以正确地计算渲染时间

drawVolume = function()
{
    start3 = new Date().getTime();  

    gl.clearColor(0.0, 0.0, 0.0, 0.0);
    gl.enable(gl.DEPTH_TEST);
    gl.bindFramebuffer(gl.FRAMEBUFFER, gl.fboBackCoord);
    gl.shaderProgram = gl.shaderProgram_BackCoord;
    gl.useProgram(gl.shaderProgram);
    gl.clearDepth(-50.0);
    gl.depthFunc(gl.GEQUAL);
    drawCube(gl,cube);
    gl.bindFramebuffer(gl.FRAMEBUFFER, null);
    gl.shaderProgram = gl.shaderProgram_RayCast;
    gl.useProgram(gl.shaderProgram);
    gl.clearDepth(50.0);
    gl.depthFunc(gl.LEQUAL);
    gl.activeTexture(gl.TEXTURE0);
    gl.bindTexture(gl.TEXTURE_2D, gl.fboBackCoord.tex);
    gl.activeTexture(gl.TEXTURE1);
    gl.bindTexture(gl.TEXTURE_2D, gl.vol_tex);
    gl.activeTexture(gl.TEXTURE2);
    gl.bindTexture(gl.TEXTURE_2D, gl.tf_tex);
    gl.uniform1i(gl.getUniformLocation(gl.shaderProgram, "uBackCoord"), 0);
    gl.uniform1i(gl.getUniformLocation(gl.shaderProgram, "uVolData"), 1);
    gl.uniform1i(gl.getUniformLocation(gl.shaderProgram, "uTransferFunction"), 2);
    //Set Texture
    drawCube(gl,cube);

    end3 = new Date().getTime();
    render_time=end3-start3;
    console.log(render_time);
}

CPU/GPU交互是异步的,这是使用驱动程序内部命令缓冲区实现的,所有发出的命令都在缓冲区中,因此不能保证在调用
new Date().getTime()
(使用
Date.now()
和缓存统一位置会更好)

在大多数情况下,不希望强制/等待给定命令的执行,但是可以使用()来引入同步点并阻止CPU端执行,直到所有命令都执行为止。然而,正如文中所指出的,这不仅测量了以前发出的命令的执行时间,还测量了暂停管道所需的时间


理想情况下,可以使用扩展来测量给定命令的执行时间,而无需暂停管道,但遗憾的是,截至目前(2016年10月),该扩展在几乎任何浏览器中都不可用/公开。

CPU/GPU交互是异步的,这是使用驱动程序内部命令缓冲区实现的,所有发出的命令都在缓冲区中,因此不能保证在调用
new Date().getTime()
(使用
Date.now()
和缓存统一的位置会更好)

在大多数情况下,不希望强制/等待给定命令的执行,但是可以使用()来引入同步点并阻止CPU端执行,直到所有命令都执行为止。然而,正如文中所指出的,这不仅测量了以前发出的命令的执行时间,还测量了暂停管道所需的时间


理想情况下,可以使用扩展来测量给定命令的执行时间,而不会使管道停滞,遗憾的是,到目前为止(2016年10月),该扩展在几乎所有浏览器中都不可用/公开。

finish
无法提供准确的时间。这在平铺架构上更是如此。所以glfinish选项在WebGL中不起作用,EXT\u disjoint\u timer\u查询在浏览器中还不可用,所以,没有其他方法来计算近似的渲染时间吗?这并不是说
finish
“在WebGL中不起作用”这不是你所认为的,无论平台如何,详细信息请阅读gmans答案。否则没有,至少在应用程序级别没有。我发现了一些WebGL评测工具,这些工具非常有用。这是链接:[link]()。我正在研究这些工具的准确性<代码>完成不会为您提供准确的计时。这在平铺架构上更是如此。所以glfinish选项在WebGL中不起作用,EXT\u disjoint\u timer\u查询在浏览器中还不可用,所以,没有其他方法来计算近似的渲染时间吗?这并不是说
finish
“在WebGL中不起作用”这不是你所认为的,无论平台如何,详细信息请阅读gmans答案。否则没有,至少在应用程序级别没有。我发现了一些WebGL评测工具,这些工具非常有用。这是链接:[link]()。我正在研究这些工具的准确性。