理解核心视频CVPixelBufferPool和CVOpenGLESTextureCache的语义

8
我正在重构我的iOS基于OpenGL的渲染管道。我的管道由许多渲染步骤组成,因此我需要许多中间纹理来进行渲染和读取。这些纹理具有各种类型(无符号字节和半浮点数),可能具有不同数量的通道。
为了节省内存和分配工作,我回收了之前在管道中使用过但不再需要的纹理。在以前的实现中,我自己完成了这个操作。
在我的新实现中,我想要使用Core Video框架提供的API来完成这个操作;特别是因为它们可以更快地从CPU访问纹理内存。我知道CVOpenGLESTextureCache允许我从CVPixelBuffer创建OpenGL纹理,可以直接创建或使用CVPixelBufferPool。然而,我无法找到任何描述它们如何工作以及它们如何相互配合的文档。
以下是我想知道的事情:
  • 要从CVOpenGLESTextureCache获取纹理,我总是需要提供像素缓冲区。如果我需要提供内存并且无法检索旧的未使用的纹理,那么为什么它被称为“缓存”?
  • CVOpenGLESTextureCacheFlush函数“刷新当前未使用的资源”。缓存如何知道资源是否“未使用”?当我释放相应的CVOpenGLESTextureRef时,纹理是否会返回到缓存中?同样的问题也适用于CVPixelBufferPool
  • 我能否在一个纹理缓存中维护具有不同属性(类型、通道数量等)的纹理?它是否知道根据我的请求可以重新使用纹理或需要创建新的纹理?
  • CVPixelBufferPool似乎只能管理相同大小和类型的缓冲区。这意味着我需要为我正在使用的每个纹理配置创建一个专用池,对吗?
如果至少能够澄清其中一些问题,我将非常高兴。
1个回答

1

是的,实际上您无法找到任何东西。我已经查找了很久,简短的答案是您只需要测试实现功能以查看其运作方式。您可以在opengl_write_texture_cache上找到我的博客文章和示例代码。基本上,它的工作方式似乎是纹理缓存对象“保存”了在执行三角形渲染时绑定的OpenGL纹理与池中缓冲区之间的关联。结果是,直到OpenGL完成使用同一缓冲区后,池才不应返回该缓冲区。在某种竞争条件的奇怪情况下,池可能会增加1个缓冲区大小,以解决保留时间过长的缓冲区问题。纹理缓存API的真正好处在于,用户只需要一次写入数据缓冲区,而不是调用类似glTexImage2D()的API将数据“上传”到显卡。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接