在webgl中,长时间运行的glsl代码可以冻结所有计算机。 在浏览shadertoy时,特别是在全屏模式下的一些示例已经冻结了我的mac,就像这样: Path Tracer MIS (progressive)
有没有办法检测着色器是否占用太多,然后从javascript级别自动杀死它?或者这高于开发人员的范围,需要由浏览器开发人员处理?
另一个问题:有没有办法(mac或linux中的插件或外部应用程序)阻止长镀铬GPU访问冻结计算机?
答案 0 :(得分:2)
这不仅仅是WebGL,所有GPU代码都可以冻结计算机。问题是,与CPU不同,当前的GPU是不可抢占的。这意味着如果你给他们30分钟的工作要做,他们将执行30分钟的工作,并且没有办法抢占他们像CPU一样做其他事情。 (没有多任务处理)
良好操作系统上的解决方案是CPU运行超时,如果GPU耗时太长,操作系统会重置GPU(实际上会重新启动它)。从Windows Vista开始,Windows就完成了这项工作。 macOS最近只添加了它,问题是他们没有设计操作系统来从像MS这样的情况中恢复,所以它需要更长时间才能使它全部工作。
好处是没有太多动力去故意这样做。如果您访问某个锁定计算机的网站,您可能会停止访问该网站,因此问题通常是自我纠正,因为人们希望您访问他们的网站。
另一方面,对于像shadertoy这样的网站来说,这是一个问题,因为人们会编写非常长而复杂的着色器,这些着色器实际上只能在高端GPU上运行,而不是普通的笔记本GPU。
就你能做些什么而言。
要求Apple修复其驱动程序和操作系统,以免崩溃。
要求Shadertoy不自动运行重型着色器
也许他们可以添加一些时间信息或其他启发式来决定 是否警告用户着色器可能太重了 他们的机器。
要求GPU公司将其GPU放在首位。
否则,即使是浏览器也无法做到。 The browser has no idea if the shader is going to be fast or slow before it runs it