如何修复着色器首次使用时的延迟?

5
我在我的应用程序中使用Instruments的OpenGL ES分析工具,它指出在编译着色器后,我应该在预热阶段调用glDrawArrays。因此,我检查了一些我编写的着色器的时间,确实第一次运行程序时速度要慢得多。
在我的代码中,我有一个通用的着色器加载器,它不知道着色器的统一变量/属性,只是编译它。而且似乎最好的预热着色器的地方就是在那里(所以我不需要到处添加glDrawArrays)。我尝试将以下内容添加到我的着色器加载器中:
glUseProgram(prog);
glDrawArrays(GL_TRIANGLES, 0, 0);

它修复了延迟问题,但由于我没有设置任何uniforms/attributes,我不确定是否安全。而且它看起来像是一种解决方法。预热程序的最佳方法是什么?
1个回答

2

您的代码(几乎)非常安全。由于制服包含一些默认值,因此它们不是问题。至于属性,也不是问题,因为您没有发出任何顶点。

另一方面,这可能是预热着色器的最简单方法,但可能不是最好的方法。类似的技术曾经用于预热纹理(填充纹理缓存)。通常是通过在不显示输出的情况下渲染几帧来完成的。例如,在《虚幻竞技场》中,加载级别后会短暂地显示“Precaching”。我建议您也这样做。


这是一篇非常好的信息,虽然这是我第一次听说着色器预热。你有相关文献吗?那将会非常有帮助。祝好 - Maurizio Benedetti
嗯,因为所有与GPU相关的实现细节都是供应商特定的且大部分保密,所以我会说在这方面没有可靠的信息(因为没人真正知道而且总是在变化)。但是概念是相同的,如果有一个被缓存或者延迟加载的资源,只需渲染几帧来填充高速缓存并导致该资源加载。除此之外就没有其他什么了… - the swine

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接