EAGLView方向改变和奇怪的缓冲

时间:2009-06-09 12:09:54

标签: iphone opengl-es core-animation

我正在编写一个应用程序,将一些沉重的绘图卸载到EAGLView中,它在UIKit上做了一些轻量级的东西。似乎在方向更改期间GL渲染被缓存到某个地方,我无法弄清楚如何访问它。具体做法是:

  • 更改方向后,调用glClear(GL_COLOR_BUFFER_BIT)不足以清除GL显示(图形缓存在某处?)如何清除此缓存?
  • 更改方向后,glReadPixel()无法再访问方向更改前绘制的像素。如何才能访问存储位置?

2 个答案:

答案 0 :(得分:0)

我不是专家,但我正在阅读Optimizing OpenGL ES for iPhone OS,并且声明:

  

避免将OpenGL ES与本机平台渲染混合

您可能希望查看它是否有帮助。

答案 1 :(得分:0)

  

更改方向后,调用glClear(GL_COLOR_BUFFER_BIT)还不足以清除GL显示(绘图在某处缓存?)如何清除此缓存?

你正在绘制一个离屏图像。当您致电-presentRenderbuffer时,该图片仅可用于CoreAnimation合成。

  

更改了方向后,glReadPixel()无法再访问方向更改前绘制的像素。如何才能访问存储位置?

我假设你正在使用RetainedBacking选项。如果没有该选项,即使在旋转之外,也无法读取前一帧的内容。当您致电-presentRenderbuffer时,屏幕外图像的内容将被发送到CA进行合成,并且新图像将取代它。新图像的内容未定义。

假设您正在使用从EAGLView示例代码派生的内容并且您正在使用RetainedBacking,则在轮换发生时,通过释放和重新分配来调整帧缓冲区的大小。发生这种情况时,任何现有内容都将丢失。

您可以:
1)通过调用ReadPixels来自行保存内容 2)永远不要重新分配帧缓冲区,而是使用transform属性旋转UIView(或CALayer)。这样做可能会在合成过程中造成相当大的性能损失,但是您可以获得正在寻找的旋转,而无需调整帧缓冲区的大小。