用户无法强制浏览器缓存着色器。由浏览器实现着色器缓存并决定何时使用它。此外,浏览器依赖于操作系统来提供一种缓存着色器的方法,所以如果操作系统不支持它,那么浏览器当然也不支持。例如,目前在 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 不支持,因为它只在不支持缓存的平台上运行。