代码之家  ›  专栏  ›  技术社区  ›  Ben Zotto sberry

当以屏幕外渲染器(iPhone GL ES)为目标时,绘制调用需要更长的时间。

  •  1
  • Ben Zotto sberry  · 技术社区  · 14 年前

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

    然而,由于我不明白的原因,时间的长短(用 CFAbsoluteTimeGetCurrent 在发送到屏幕外缓冲区时,实际的draw调用在 更多 比一个 数量级 比绘制到支持实际uiview的主帧缓冲区时长。所有的GL状态对于两者都是相同的,并且几何列表是相同的,并且要绘制的调用序列是相同的。

    注意这里有很多几何图形——数量级显然是可以测量和重复的。还要注意我 计时 glReadPixels 调用,我认为这实际上是从GPU中提取数据。这只是一个花费在例如 glDrawArrays .

    我试过了:

    • 在进行屏幕外渲染之后,再次将该几何图形渲染到屏幕:屏幕绘制所用的时间相同。
    • 连续两次渲染屏幕外的内容——两次都显示相同的慢速绘制速度。

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

    感谢您的理解/解释!

    3 回复  |  直到 14 年前
        1
  •  1
  •   Pivot    14 年前

    最好的办法可能是对屏幕外的渲染和窗口系统的渲染进行采样,并使用仪器中的CPU取样器对每个系统进行紧密循环,然后比较结果,看看有什么不同。

    另外,你能更清楚地知道你所说的“连续两次渲染屏幕外的东西”是什么意思吗?_您在问题开始时提到您__在屏幕外创建一个新的GL上下文___您是指一个新的framebuffer和renderbuffer,还是一个全新的eaglcontext?根据为进行屏幕外渲染而重新创建的新资源和对象的数量,驱动程序可能需要做大量工作,以便在第一次在绘图调用中使用这些资源时设置这些资源。如果你只是在屏幕上截取你放在屏幕上的内容,你甚至不需要做任何一件事,这就足够了 glReadPixels 之前 -[EAGLContext presentRenderbuffer:] ,因为此时仍将定义backuffer内容。

        2
  •  0
  •   hotpaw2    14 年前

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

        3
  •  0
  •   Novikov    14 年前

    我不是这个问题的专家,但据我所知,图形加速器用于向屏幕发送数据,所以通常路径是代码-顶点-加速器-渲染图像-屏幕。在本例中,您将把帧缓冲区刷新回主内存中,这可能会碰到内存控制器中带宽的某种瓶颈或其他问题。