消费者生产者模型中的双缓冲OpenGL对象

时间:2013-08-25 08:50:08

标签: ios multithreading opengl-es

在我的OpenGL iOS应用程序中,我正在尝试实现生产者 - 消费者模型,其中生产者需要加载纹理,而消费者需要显示它们。从阅读文档,我知道这将需要使用EAGL共享组,并且共享的OpenGL对象应该是双缓冲的。但是,我不太确定哪个OpenGL对象应该是双缓冲的。纹理还是frambuffer?我的制作人每次需要显示一个新帧时都会加载三个纹理,因此我认为切换帧缓冲可能更有效。

所以,在高层次上,这就是我认为应该发生的事情:

  1. 在openGL初始化期间的某处创建一个renderbuffer和两个framebuffers(frameBuffers [2])。
  2. 在生产者线程中,当消费者线程使用frameBuffers [0]时,将传入的帧作为OpenGL纹理加载到frameBuffers [1]上,并将帧缓冲区ID推送到某种共享队列中。
  3. 在使用者线程中,从共享队列中弹出下一个帧缓冲区ID,并使用它来绑定帧缓冲区(glBindFramebuffer(GL_FRAMEBUFFER,i))。最后交换renderbuffer进行显示。
  4. 有意义吗?有没有更好的方法来实现这一切?

1 个答案:

答案 0 :(得分:0)

我认为既然你在谈论每帧加载新纹理,你不只是从磁盘中抓取它们。 (为此,GLKTextureLoader为异步加载提供了一个简单的界面。)

对于受设计异步部分影响的对象,您应该使用双缓冲。在这种情况下,您将异步加载纹理,因此纹理对象应该是双缓冲的。当您的生产者线程正在加载纹理0,1和2时,您的使用者线程可以从纹理3,4和5中进行绘制。只要两个操作在大约相同的时间内完成,您就可以交换每个缓冲区的集合。帧;否则你需要考虑三重缓冲。