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

How to calculate rendering time in WebGL? Looks like I am calculating it wrongly

我是运行一个基于WebGL体积渲染的交互式浏览器。当我使用鼠标进行交互时,函数 drawVolume() 被调用。为了测量渲染时间,我在 startend 处获取时间戳。 差异 给了我渲染时间。 目前我运行它在两台机器上:客户端和服务器

观察结果如下:

服务器机器:[NVIDIA GeForce GTX970] Render_time 大约小于 2ms。交互速度更快。

客户端机器:[NVIDIA Quadro K600] Render_time 大约是 10-11ms。交互式显示较慢,帧更新缓慢。有时显示驱动程序停止工作并且显示熄灭。我需要重启系统。

我不知道这种计算渲染时间的方法是否正确。不知何故,尽管代码已执行,但在硬件级别,渲染图像尚未显示在浏览器上 window。如何了解为相应交互更新的相应框架。如果我获得该状态,那么也许我可以正确计算渲染时间。

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() 并缓存统一位置会更好。)。

在大多数情况下,不希望 force/wait 执行给定命令,但是可以使用 finish(man page) which introduces a sync point and blocks CPU side execution until all commands are executed. However as pointed out in gmans answer here 这不仅可以测量先前发出的命令的执行时间,还可以测量它所花费的时间停止管道。

理想情况下,人们会使用 EXT_disjoint_timer_query 扩展来测量给定命令的执行时间而不会停止管道,遗憾的是截至目前(2016 年 10 月)此扩展还没有 available/exposed几乎任何浏览器。