如何计算 WebGL 中的渲染时间?看来我计算错了
How to calculate rendering time in WebGL? Looks like I am calculating it wrongly
我是运行一个基于WebGL体积渲染的交互式浏览器。当我使用鼠标进行交互时,函数 drawVolume() 被调用。为了测量渲染时间,我在 start 和 end 处获取时间戳。 差异 给了我渲染时间。
目前我运行它在两台机器上:客户端和服务器
观察结果如下:
服务器机器:[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几乎任何浏览器。
我是运行一个基于WebGL体积渲染的交互式浏览器。当我使用鼠标进行交互时,函数 drawVolume() 被调用。为了测量渲染时间,我在 start 和 end 处获取时间戳。 差异 给了我渲染时间。 目前我运行它在两台机器上:客户端和服务器
观察结果如下:
服务器机器:[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几乎任何浏览器。