我已经在Three.js中进行了raymarched项目一年多了,并且随着复杂性的增加,初始化时间也增加了。现在,在浏览器中加载项目可能需要40秒钟以上的时间,但是加载后的运行速度为+ 60fps。我已经通过性能测试找到了罪魁祸首,似乎挂在了三库中的InitMaterial函数上。是否有人对导致此挂断的原因有任何想法?我个人认为这可能是由于我们在着色器中使用的制服数量过多,因为其中有很多。
您可以找到code in question here。请注意,globalsinclude.glsl是制服列表所在的位置。
答案 0 :(得分:0)
这通常是Windows上DirectX的问题。我怀疑如果您在Linux或Mac上尝试使用同一页面,或者在Windows上以--use-angle=gl
启动Chrome,则会看到时间的推移。
例如,您可以try this ridiculous shader。在OpenGL上编译大约需要3秒钟,但是在DirectX中,浏览器可能会确定它花费的时间太长并重置GPU进程。
对于这个问题,浏览器无能为力,因为它主要在Microsoft法庭上进行。 Microsoft为本地游戏设计了DirectX。本机游戏可以离线编译着色器。 Web无法做到这一点,因为它们是传递给驱动程序的不透明二进制文件,并且可能充满漏洞。
已经有关于将异步着色器编译功能添加到WebGL的讨论。着色器仍将花费40秒进行编译,只是不会阻塞页面。在这一点上虽然不太可能发生。
我唯一可以建议的就是简化着色器。如果您有循环,则可以将其解开,看看是否有帮助。