Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
WebGL着色器缓存是否可行?_Webgl_Webgl2 - Fatal编程技术网

WebGL着色器缓存是否可行?

WebGL着色器缓存是否可行?,webgl,webgl2,Webgl,Webgl2,我的问题与类似,但我不想预编译着色器。相反,我只希望浏览器存储它编译的着色器的时间比默认值长。现在,每次刷新页面时,都必须重新编译着色器 我理解在和等答案中提出的安全性和可移植性问题。假设浏览器正在缓存它为我的web应用程序编译的着色器,这些似乎都不是问题 假设使用相同的OS+浏览器+GPU+驱动程序组合,是否有办法使浏览器缓存已编译的着色器,从而在每次刷新页面后不需要进行着色器编译?用户无法强制浏览器缓存着色器。由浏览器来实现着色器缓存并决定何时使用它。此外,浏览器依赖操作系统提供缓存着色器的

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

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


假设使用相同的OS+浏览器+GPU+驱动程序组合,是否有办法使浏览器缓存已编译的着色器,从而在每次刷新页面后不需要进行着色器编译?

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

例如,在中搜索“BINARY”,您将看到缓存的格式数为0。换句话说,您不能在MacOS上缓存OpenGL着色器

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

Chrome可以缓存着色器。但是如果操作系统不支持它,它就不能

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

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

至于Windows,我相信DirectX允许通过缓存着色器和Chrome来缓存它们。在Windows上进行快速测试似乎可以证明这一点。第一次加载页面时,我会去shadertoy.com,这需要一段时间。下一次它不会。另一个测试。在shadertoy上拾取复杂着色器。编辑着色器中的某些常量,例如将1.0更改为1.01,然后按“编译”按钮。看看编译时间。现在将其更改回1.0并按compile。在我的测试中,建议缓存着色器的第二次编译花费的时间要少得多

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