WebGL 着色器缓存是否可行?
Is WebGL Shader Caching Possible?
我的问题类似于 ,但我不想预编译我的着色器。相反,我只希望浏览器将其编译的着色器存储的时间比默认时间长。现在,每次刷新页面时,都必须重新编译着色器。
我理解 this one and 等回答中提出的安全性和可移植性问题。假设浏览器正在缓存它为我的网络应用程序编译的着色器,这些似乎都不是问题。
假设同样的OS+浏览器+GPU+驱动组合,有没有办法让浏览器缓存编译好的shader,这样每次刷新页面就不需要再编译shader了?
用户无法强制浏览器缓存着色器。由浏览器来实现着色器缓存并决定何时使用它。此外,浏览器依赖 OS 来提供缓存着色器的方法,因此如果 OS 不支持它,那么浏览器当然也不支持。例如,当前在 MacOS 上,WebGL 在 OpenGL 之上运行,而 Mac 上的 OpenGLOS 无法缓存着色器。
例如在this official Apple OpenGL feature table中搜索'BINARY',你会看到缓存的格式数量为0。换句话说,你不能在Mac上缓存OpenGL着色器OS
我不太了解 Metal,有可能某些未来版本的 WebGL 可以在 Metal 之上编写,也许 Metal 提供了一种方法。
Chrome 可以缓存着色器。 Here's the code for caching them。但如果 OS 不支持它就不能。
然后就是什么时候清除或者不使用缓存的问题了。如果用户按下 'refresh',缓存是否应该被清除?请注意,'refresh' 是用户发出的不缓存页面的信号。有很多方法可以重新访问。一、再次点击一个link进入页面,从书签中选取,在URL栏中输入。所有这些都不会清除缓存。单击 'Refresh' 按钮 AFAIK 至少会忽略特定请求(即页面本身)的缓存,但不会忽略页面引用的内容。
如果用户选择清空浏览器的正常网络资源缓存,是否应该清除缓存?显然,只要驱动程序更改版本号,就应该清除缓存。清除缓存可能还有其他原因,因为浏览器需要确保它永远不会提供错误或过时的着色器。
至于 Windows 我相信 DirectX 允许缓存着色器和 Chrome,通过 ANGLE 缓存它们。对 Windows 的快速测试似乎可以证明这一点。第一次加载页面时转到 shadertoy.com 需要一段时间。下一次就没有了。另一个测试。在 shadertoy 上选择一个复杂的着色器。在着色器中编辑一些常量,例如将 1.0 更改为 1.01 并按下编译按钮。看编译时间。现在将其改回 1.0 并按编译。在我的测试中,第二次编译花费的时间要少得多,这表明着色器已被缓存。
我不知道 Firefox 是否缓存着色器。 Safari 不支持,因为它只能在不支持缓存的平台上运行。
我的问题类似于
我理解 this one and
假设同样的OS+浏览器+GPU+驱动组合,有没有办法让浏览器缓存编译好的shader,这样每次刷新页面就不需要再编译shader了?
用户无法强制浏览器缓存着色器。由浏览器来实现着色器缓存并决定何时使用它。此外,浏览器依赖 OS 来提供缓存着色器的方法,因此如果 OS 不支持它,那么浏览器当然也不支持。例如,当前在 MacOS 上,WebGL 在 OpenGL 之上运行,而 Mac 上的 OpenGLOS 无法缓存着色器。
例如在this official Apple OpenGL feature table中搜索'BINARY',你会看到缓存的格式数量为0。换句话说,你不能在Mac上缓存OpenGL着色器OS
我不太了解 Metal,有可能某些未来版本的 WebGL 可以在 Metal 之上编写,也许 Metal 提供了一种方法。
Chrome 可以缓存着色器。 Here's the code for caching them。但如果 OS 不支持它就不能。
然后就是什么时候清除或者不使用缓存的问题了。如果用户按下 'refresh',缓存是否应该被清除?请注意,'refresh' 是用户发出的不缓存页面的信号。有很多方法可以重新访问。一、再次点击一个link进入页面,从书签中选取,在URL栏中输入。所有这些都不会清除缓存。单击 'Refresh' 按钮 AFAIK 至少会忽略特定请求(即页面本身)的缓存,但不会忽略页面引用的内容。
如果用户选择清空浏览器的正常网络资源缓存,是否应该清除缓存?显然,只要驱动程序更改版本号,就应该清除缓存。清除缓存可能还有其他原因,因为浏览器需要确保它永远不会提供错误或过时的着色器。
至于 Windows 我相信 DirectX 允许缓存着色器和 Chrome,通过 ANGLE 缓存它们。对 Windows 的快速测试似乎可以证明这一点。第一次加载页面时转到 shadertoy.com 需要一段时间。下一次就没有了。另一个测试。在 shadertoy 上选择一个复杂的着色器。在着色器中编辑一些常量,例如将 1.0 更改为 1.01 并按下编译按钮。看编译时间。现在将其改回 1.0 并按编译。在我的测试中,第二次编译花费的时间要少得多,这表明着色器已被缓存。
我不知道 Firefox 是否缓存着色器。 Safari 不支持,因为它只能在不支持缓存的平台上运行。