WebGL 大纹理导致 chrome 中的隐藏停顿

WebGL large texture causes hidden stalling in chrome

在 Windows 10(使用 Three.js)在 WebGL 中初始化大型 (4096 x 4096) 纹理时,chrome 的主线程停顿了相当长的时间,而探查器显示没有任何反应。

这是 4096 x 4096 纹理的示例配置文件:

1500ms 之前的 "plateau" 是在 Three.js 和 WebGL 中对 texImage2D 的调用,然后 requestAnimationFrame 代码在幻影间隙显示之前被调用两次向上。

这是什么原因造成的? chrome 中的底层 WebGL 代码是否发生了探查器未报告的事情?为什么调用 texImage2D 需要 90 毫秒,然后出现空白点?我希望所有涉及将纹理加载到 GPU 的工作都发生在那里。

Here is a link 应该重现该行为。

嗯,4096 x 4096 是一个大纹理,将所有数据传输到 GPU 需要一些时间。如果您正在调用 texImage2D 然后立即调用 drawArrays,则 drawArray 无法执行,直到 texImage2D 中的上传完成。这解释了您在探查器中看到的延迟。

原来这里的问题出在requestAnimationFrame。这里有两个配置文件来说明

requestAnimationFrame:

setTimeout:

这似乎是一个相当大的问题,因为现有的大多数 WebGL 教程都提到 requestAnimationFrame 是执行动画循环的 "correct" 方法。

已在此处更新 demo