0

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

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

  1. 在 openGL 初始化期间的某处创建一个渲染缓冲区和两个帧缓冲区 (frameBuffers[2])。
  2. 在生产者线程中,当消费者线程使用 frameBuffers[0] 时,将传入的帧作为 OpenGL 纹理加载到 frameBuffers[1] 上,并将帧缓冲区 ID 推送到某种共享队列中。
  3. 在消费者线程中,从共享队列中弹出下一个帧缓冲区ID,并使用它来绑定帧缓冲区(glBindFramebuffer(GL_FRAMEBUFFER,i))。最后交换渲染缓冲区以显示。

是否有意义?有没有更好的方法来实现这一切?

4

1 回答 1

0

I presume since you're talking about loading new textures every frame you're not just grabbing them from disk. (For that, GLKTextureLoader provides an easy interface for asynchronous loading.)

You should use double buffering for the objects affected by the asynchronous part of your design. In this case, you're asynchronously loading textures, so the texture objects should be double-buffered. While your producer thread is loading textures 0, 1, and 2, your consumer thread can be drawing from textures 3, 4, and 5. So long as both operations complete in about the same amount of time, you can swap sets of buffers each frame; otherwise you'll need to look into triple buffering.

于 2013-09-05T23:53:30.230 回答