performance - 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);
});
}
我无法分享我使用的确切代码,但一个模型可以说明我的观点。
我正在渲染一个相当复杂的场景,并且还在 WebGL 中进行一些光线追踪。我注意到两个非常奇怪的性能问题。
1) 运行之间的帧速率不一致。有时,当页面开始在 25 毫秒内渲染前约 100 帧时,它会突然下降到 45 毫秒,没有任何用户输入或对场景进行更改。我不更新帧中的任何缓冲区或纹理数据,只更新着色器制服。当这种情况发生时,GPU 内存保持不变。
2) 渲染到默认帧缓冲区比使用额外通道要慢。如果我渲染到创建的帧缓冲区,然后将 blit 到 HTML 画布(默认帧缓冲区),我会获得 10% 的性能提升。所以在代码片段中,如果useFramebuffer == true
获得了性能,这似乎很反直觉。
编辑1:
由于需求的变化,场景总是会渲染到帧缓冲区,然后复制到画布上。这使得问题 2) 不再是问题。
编辑2:
测试的 PC 系统规格:
- 操作系统:赢 10
- CPU:英特尔 i7-7700
- 英伟达 GTX 1080
- 内存:16 GB
编辑3:
我使用 chrome:tracing 对场景进行了分析。前约 100-200 帧渲染 16.6 毫秒。
我将尝试使用计时器查询来分析所有内容,但我担心每个渲染实际上需要相同的时间,并且缓冲区交换将随机花费两倍的时间。
我注意到的另一件事是,当我使用 Chrome 一段时间后,这种情况就开始发生了。当问题开始时,清除浏览器缓存或终止 Chrome 进程无济于事,只有重新启动系统才有用。
Chrome是否有可能一时兴起限制GPU?
PS 由于一些优化,帧时间发生了变化,但核心问题仍然存在。
解决方案
推荐阅读
- sql - 如果存在特定行类型,则从特定行选择行到最新行
- javascript - 用于检查 Excel 工作表名称的无效字符的 JavaScript 正则表达式
- flutter - 在 Flutter 故事视图中设置视频时长
- php - Wordpress 重定向做错了
- breadcrumbs - 摩纳哥编辑面包屑
- plot - 在 MATLAB R2015b 中绘制阴影条形图时出现错误“未定义的函数或变量 'applyhatch_plusC'”
- performance - 如何在 GtMetrix 中修复错误(失败)net::ERR_HTTP2_SERVER_REFUSED_STREAM
- django - 如何同时使用 Nuxt 和 Django 进行生产?
- spring-boot - 如何在 Springboot Mongo 存储库中为嵌套对象执行 Findby
- azure - 摩卡测试错误 - 在上下文中。