在定位屏幕外渲染缓冲区时,绘制调用的时间会更长(iPhone GL ES)

时间:2010-09-03 20:25:44

标签: iphone optimization opengl-es

我正在使用OpenGL ES 1.1在iPhone应用中呈现大视图。我有一个“屏幕截图”/“保存”功能,它基本上在屏幕外创建一个新的GL上下文,然后采用完全相同的几何体并将其渲染到屏幕外的上下文。这会产生预期的结果。

然而由于我不明白的原因,当发送到屏幕外缓冲区时,实际绘制调用所花费的时间(使用CFAbsoluteTimeGetCurrent之前和之后测量) more 数量级比绘制到支持实际UIView的主帧缓冲区时更长。所有GL状态对于两者都是相同的,并且几何列表是相同的,并且绘制的调用序列是相同的。

请注意,这里恰好有很多几何形状 - 数量级明显可测量且可重复。另请注意,我计时glReadPixels调用,我认为这实际上是从GPU中提取数据。这只是花在例如时间上的时间。 glDrawArrays

我试过了:

  • 在完成屏幕外渲染后,再次将该几何图形渲染到屏幕上:屏幕绘制需要相同的快速时间。
  • 连续两次渲染屏幕外的东西 - 两次显示相同的慢速绘制速度。

这是屏幕外缓冲区的固有限制吗?或者我可能会遗漏一些基本的东西吗?

感谢您的见解/解释!

3 个答案:

答案 0 :(得分:1)

您最好的选择可能是对屏幕外渲染和窗口系统进行采样,并使用仪器中的CPU采样器进行紧密循环,并比较结果以查看存在的差异。

另外,你是否可以通过“连续两次渲染屏幕外事物”来更清楚你的意思?你在问题的开头提到你“在屏幕外创建一个新的GL背景” - 你呢是指一个新的帧缓冲区和渲染缓冲区,还是一个全新的EAGLContext?根据您为了进行屏幕外渲染而创建的新资源和对象的数量,驱动程序可能需要在第一次在绘制调用中使用它们时进行大量工作来设置这些资源。如果您只是截取屏幕上显示的相同内容,则甚至不需要执行任何此操作 - 在glReadPixels之前调用-[EAGLContext presentRenderbuffer:]就足够了,因为后备缓冲区内容仍然存在在那时被定义。

答案 1 :(得分:0)

屏幕外渲染是否会强制GPU清除其所有正常状态,然后执行渲染,刷新屏幕外环,并且必须从CPU内存重新加载所有正常的内容?这可能比使用完全保留在GPU上的数据和帧缓冲区的任何渲染花费更长的时间。

答案 2 :(得分:0)

我不是这个问题的专家,但据我所知,图形加速器用于将数据发送到屏幕,所以通常路径是Code --- vertices --->加速器---渲染图像--->屏幕。在你的情况下,你正在将帧缓冲区刷回到主存储器中,这可能会在内存控制器或其他东西中遇到某种带宽瓶颈。