2017-05-22 16 views
0

在webgl中,长时间运行的glsl代码可以冻结所有的计算机。 当浏览shadertoy,一些例子尤其是在全屏模式下已经冻结了我的Mac像这样的: Path Tracer MIS (progressive)停止一个很长的webgl进程,从chrome冻结

有什么方法来检测着色器是否正在太多,然后从JavaScript的水平自动杀呢?或者这超出了开发人员的范围,需要由浏览器开发人员来处理?

另一个问题:有没有一种方法(mac或linux中的插件或外部应用程序),防止长时间的chrome GPU访问冻结计算机?

回答

2

这不仅仅是WebGL,所有GPU代码都可以冻结计算机。问题是,与CPU不同,当前的GPU不可抢占。这意味着如果你给他们30分钟的工作时间,他们将会执行这项工作30分钟,并且没有办法阻止他们像使用CPU那样做其他事情。 (没有多任务处理)

良好操作系统的解决方案是CPU运行超时,如果GPU花费太长时间操作系统重置GPU(有效地重新启动它)。自Windows Vista以来,Windows已经做到了这一点。 macOS最近只是增加了它,问题在于他们没有设计操作系统来恢复像MS这样的情况,所以需要更长的时间才能完成所有工作。

好的是没有太多的动机来实现它的目的。如果您访问某个锁定您的计算机的网站,则可能会停止访问该网站,因此问题通常会自行更正,因为人们希望您访问其网站。

另一方面,对于像shadertoy这样的网站来说,这是一个问题,人们会写出非常长且复杂的着色器,这些着色器只能在顶级GPU上运行,而不能在普通笔记本GPU上运行。

至于你能做些什么。

  • 请求苹果公司修复他们的驱动程序和操作系统,使其不会崩溃。

  • 问Shadertoy为不自动运行重着色器

    也许他们可以添加一些定时信息或其他启发式算法来确定 是否要警告着色器可能是 他们的机器太重的用户。

  • 要求GPU公司让其GPU可抢占。

否则,即使浏览器可以做的事情也不多。 The browser has no idea if the shader is going to be fast or slow before it runs it