Chrome WebGL的性能异常不一致?

Alo*_*alo 5 performance google-chrome webgl

function render(time, scene) {
    if (useFramebuffer) {
        gl.bindFramebuffer(gl.FRAMEBUFFER, scene.fb);
    }

    gl.viewport(0.0, 0.0, canvas.width, canvas.height);
    gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);
    gl.enable(gl.DEPTH_TEST);

    renderScene(scene);

    gl.disable(gl.DEPTH_TEST);
    if (useFramebuffer) {
        gl.bindFramebuffer(gl.FRAMEBUFFER, null);
        copyFBtoBackBuffer(scene.fb);
    }

    window.requestAnimationFrame(function(time) {
        render(time, scene);
    });
}
Run Code Online (Sandbox Code Playgroud)

我无法分享我使用的确切代码,但是一个模型将说明我的观点。

我正在渲染一个相当复杂的场景,并且还在WebGL中进行了一些光线追踪。我注意到了两个非常奇怪的性能问题。

1)两次运行之间的帧率不一致。有时,当页面开始时,最初的约100帧在25ms内渲染,然后突然下降到45ms,而无需用户输入或更改场景。我不会更新帧中的任何缓冲区或纹理数据,而仅更新着色器制服。发生这种情况时,GPU内存将保持不变。

2)渲染到默认帧缓冲区比使用额外的传递慢。如果渲染到创建的frambuffer,然后渲染到HTML canvas(默认的framebuffer),则性能提高了10%。因此,在代码段中,如果useFramebuffer == true获得了性能,这似乎非常不直观。

编辑1:

由于需求的变化,场景将始终渲染到帧缓冲区,然后复制到画布。这使问题2)成为非问题。

编辑2:

在以下系统上测试了PC的系统规格:

  • 操作系统:Win 10
  • 处理器:Intel i7-7700
  • 英伟达GTX 1080
  • 内存:16 GB

编辑3:

我使用chrome:tracing描绘了场景。前约100-200帧渲染16.6ms。

快的部分

然后开始丢帧。 慢的部分

我将尝试使用计时器查询来分析所有内容,但恐怕每个渲染实际上花费相同的时间,并且缓冲区交换将随机花费两倍的时间。

我注意到的另一件事是,当我使用Chrome一段时间后,这种情况开始发生。问题开始时,清除浏览器缓存或取消Chrome进程无济于事,只有重新启动系统才能起作用。

Chrome是否有可能一时兴起地限制GPU?

PS帧时间由于一些优化而改变,但核心问题仍然存在。