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

标签 iphone opengl-es-2.0

我在应用程序中运行了 Instruments 中的 OpenGL ES 分析工具,它指出编译着色器后,我应该在预热过程中调用 glDrawArrays。于是我检查了自己写的一些着色器的时间,确实程序第一次运行的时候慢了很多。

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

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

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

最佳答案

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

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

关于iphone - 如何修复首次使用着色器时的延迟?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7330095/

相关文章:

iphone - 如何在 OpenGL ES 2.0 中为每个网格加载不同的纹理?

android - GLSurfaceView 的大小和位置

android - OpenGL - 为什么 normalize() 不是幂等的?

iphone - 如何使用 facebook ios sdk 发出好友请求?

iphone - 如何让 UITableView 行高自动调整为 UITableViewCell 的大小?

ios - 什么是 iOS OpenGL ES 2.0 离屏帧缓冲区对象?

java - 如何检查 3D 对象是否与 OpenGL ES 2 中的射线相交 - Android

iphone - 我的 iphone 3gs 应用程序可以在 iphone 4 上正常运行吗?

iphone - 用于流式传输 aac 音频的 AudioQueue 缓冲区大小

iphone - 如何在 Photoshop 中为 iOS 创建可调整大小的标题图像?