自定义着色器 material 需要很长时间才能初始化?
Custom shader material taking forever to initialize?
我在 three.js 中从事一个 raymarched 项目已经一年多了,随着复杂性的增加,初始化时间也随之增加。现在在浏览器中加载项目可能需要 40 多秒,但加载后以 +60fps 运行。我已经通过性能测试找到了罪魁祸首函数,它似乎挂在了 three 库中的 InitMaterial 函数上。有谁知道可能导致此挂断的原因是什么?我个人认为这可能是因为我们在着色器中使用的制服数量很多。
您可以找到 code in question here。请注意,globalsinclude.glsl 是制服列表所在的位置。
这是 Windows 上 DirectX 的普遍问题。我怀疑如果您在 Linux 或 Mac 上尝试相同的页面,或者在 Windows 上使用 --use-angle=gl
启动 Chrome,您会看到时间下降。
例如,您可以 try this ridiculous shader。在 OpenGL 上编译大约需要 3 秒,但在 DirectX 中,浏览器可能会认为编译时间太长并重置 GPU 进程。
对于这个问题,浏览器无能为力,因为它主要是在微软的法庭上。微软为原生游戏设计了 DirectX。原生游戏可以离线编译着色器。 Web 无法做到这一点,因为它们是传递给驱动程序的不透明二进制文件,可能充满漏洞。
有人在谈论向 WebGL 添加异步着色器编译功能。着色器仍然需要 40 秒来编译它只是不会阻塞页面。不过目前这不太可能发生。
我唯一能建议的就是简化你的着色器。如果你有循环,可以解开它们,看看是否有帮助。
我在 three.js 中从事一个 raymarched 项目已经一年多了,随着复杂性的增加,初始化时间也随之增加。现在在浏览器中加载项目可能需要 40 多秒,但加载后以 +60fps 运行。我已经通过性能测试找到了罪魁祸首函数,它似乎挂在了 three 库中的 InitMaterial 函数上。有谁知道可能导致此挂断的原因是什么?我个人认为这可能是因为我们在着色器中使用的制服数量很多。
您可以找到 code in question here。请注意,globalsinclude.glsl 是制服列表所在的位置。
这是 Windows 上 DirectX 的普遍问题。我怀疑如果您在 Linux 或 Mac 上尝试相同的页面,或者在 Windows 上使用 --use-angle=gl
启动 Chrome,您会看到时间下降。
例如,您可以 try this ridiculous shader。在 OpenGL 上编译大约需要 3 秒,但在 DirectX 中,浏览器可能会认为编译时间太长并重置 GPU 进程。
对于这个问题,浏览器无能为力,因为它主要是在微软的法庭上。微软为原生游戏设计了 DirectX。原生游戏可以离线编译着色器。 Web 无法做到这一点,因为它们是传递给驱动程序的不透明二进制文件,可能充满漏洞。
有人在谈论向 WebGL 添加异步着色器编译功能。着色器仍然需要 40 秒来编译它只是不会阻塞页面。不过目前这不太可能发生。
我唯一能建议的就是简化你的着色器。如果你有循环,可以解开它们,看看是否有帮助。