2016-09-18 43 views
0

当前OpenGL驱动程序使用编译着色器缓存位于 C:/用户/名/应用程序数据/漫游/ AMD | NVIDIA/glcache/...如何清除OpenGL着色缓存

不幸的是,它会导致程序崩溃差不多每当我更改某些着色器时,我目前通过手动删除着色器高速缓存来修复这些着色器。

问题是,当我发布新版本的程序时,是否有任何清除缓存的好方法?任何opengl扩展来控制缓存?或者来自操作系统的一些神奇的API?或者至少是找到文件夹的正确方法?

另一个问题:驱动程序使用哪些键来识别单个着色器?所以我可以在每次更改着色器时以某种方式更改密钥。

回答

3

不幸的是,它几乎每次更改某些着色器时都会导致程序崩溃,我目前通过手动删除着色器高速缓存来修复这些着色器。

如果发生这种情况,系统和/或驱动程序的安装会出现严重问题。这一定不会发生,如果它确实发生了,那么OpenGL程序就不应该关注它自己。

另一个问题:驱动程序使用哪些键来识别单个着色器?

通常来自着色器源AST的一些哈希值(即只是添加一个空格或重命名一个符号将不会成功)。

问题是,当我发布新版本的程序时,是否有任何清除缓存的好方法?

不是我所知道的。着色器是OpenGL规范中的“黑匣子”。您发送GLSL源文本,将其编译并链接,就是这样。诸如着色器缓存或内部表示之类的东西不是由OpenGL指定的。

任何OpenGL扩展控制缓存?

没有。技术上,供应商可以为此添加供应商特定的扩展,但没有。

或从操作系统一些神奇的API?

没有正式指定的。

,或者至少,找到这个文件夹的正确方法?

同样一无所知,这是正确的规定。

+0

它发生在我的电脑(amd gpu)和朋友的电脑(nvidia)上,还有一个。因此我认为它不是OS也不是司机相关的。如果它不是一个常见问题,就像你说的那样,在我的着色器加载/编译/链接代码中给我留下了问题,对吧?我做广泛的检查任何错误,我也测试它与调试上下文和错误回调设置,并没有错误。接下来你会提出什么建议?我应该编辑问题并添加加载代码? – Tomas

+0

@Tomas:是的,看到你的着色器加载代码会有所帮助。另外,程序崩溃状态的回溯将有助于:在调试模式下编译并使用调试器运行。 Visual Studio提供了一个堆栈跟踪窗口,在GDB中你可以使用“backtrace”命令。您不会看到驱动程序中发生了什么,但是您可以看到程序执行哪些步骤导致崩溃。 – datenwolf