如何解决首次使用着色器时的延迟?

时间:2011-09-07 07:09:22

标签: iphone opengl-es-2.0

我在我的应用程序中运行了来自Instruments的OpenGL ES分析工具,它表示在编译着色器之后,我应该在预热传递中调用glDrawArrays。所以我查看了我写的一些着色器的时间,实际上程序第一次运行它的速度要慢得多。

在我的代码中,我有一个通用着色器加载器,它不知道着色器制服/属性,它只是编译它。似乎预热着色器的最佳位置就在那里(所以我不需要在任何地方添加glDrawArrays)。我尝试在我的着色器加载器中添加它:

glUseProgram(prog);
glDrawArrays(GL_TRIANGLES, 0, 0);

它修正了延迟,但由于我没有设置任何制服/属性,我不确定它是否安全。它也看起来像一个解决方法。预热该计划的最佳方式是什么?

1 个答案:

答案 0 :(得分:2)

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

另一方面,这可能是预测着色器的最简单方法,但可能不是最好的。一次使用类似的技术来预热纹理(填充纹理缓存)。通常通过渲染几帧而不显示输出来完成。例如在虚幻竞技场中看到这一点,它在加载关卡后显示“暂停”一段时间。我建议也这样做。