【问题标题】:Is WebGL Shader Caching Possible?WebGL 着色器缓存是否可行?
【发布时间】:2019-05-31 20:09:13
【问题描述】:

我的问题类似于Saving/Loading compiled WebGL shaders,但我不想预编译我的着色器。相反,我只希望浏览器存储它编译的着色器比默认时间长。现在,每次我刷新页面时,都必须重新编译着色器。

我了解this onethis one 等答案中提出的安全性和可移植性问题。假设浏览器正在缓存它为我的网络应用程序编译的着色器,这些似乎都不是问题。

假设同样的OS+浏览器+GPU+驱动组合,有没有办法让浏览器缓存编译好的shader,使得每次页面刷新后都不需要编译shader?

【问题讨论】:

    标签: webgl webgl2


    【解决方案1】:

    用户无法强制浏览器缓存着色器。由浏览器实现着色器缓存并决定何时使用它。此外,浏览器依赖于操作系统来提供一种缓存着色器的方法,所以如果操作系统不支持它,那么浏览器当然也不支持。例如,目前在 MacOS 上,WebGL 在 OpenGL 之上运行,而 MacOS 上的 OpenGL 无法缓存着色器。

    例如在this official Apple OpenGL feature table 中搜索“BINARY”,您会看到缓存格式的数量为 0。换句话说,您无法在 MacOS 上缓存 OpenGL 着色器

    我不太了解 Metal,有可能未来的 WebGL 版本可以在 Metal 之上编写,也许 Metal 提供了一种方法。

    Chrome 可以缓存着色器。 Here's the code for caching them。但是如果操作系统不支持它就不能。

    然后是何时清除或不使用缓存的问题。如果用户按下“刷新”,是否应该清除缓存。请注意,“刷新”是用户发出的不缓存页面的信号。有很多方法可以重温。一,再次单击页面链接,从书签中选择,在 URL 栏中输入。所有这些都不会清除缓存。单击“刷新”按钮 AFAIK 至少会忽略特定请求(即页面本身)的缓存,但不会忽略页面引用的内容。

    如果用户选择清空浏览器的正常网络资源缓存,是否应该清除缓存?显然,只要驱动程序更改版本号,就应该清除缓存。清除缓存可能还有其他原因,因为浏览器需要确保它永远不会提供错误或过时的着色器。

    对于 Windows,我相信 DirectX 允许缓存着色器和 Chrome,通过 ANGLE 缓存它们。在 Windows 上进行的快速测试似乎证明了这一点。我第一次加载页面时要访问 shadertoy.com 需要一段时间。下次就不行了。另一个测试。在 shadertoy 上选择一个复杂的着色器。在着色器中编辑一些常量,例如将 1.0 更改为 1.01 并按下编译按钮。看编译时间。现在将其改回 1.0 并按编译。在我的测试中,第二次编译所花费的时间要少得多,这表明着色器已被缓存。

    我不知道 Firefox 是否缓存着色器。 Safari 不支持,因为它只在不支持缓存的平台上运行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-25
      • 2017-07-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多