了解核心视频CVPixelBufferPool和CVOpenGLESTextureCache语义

时间:2014-10-17 16:39:24

标签: ios caching opengl-es textures core-video

我正在重构基于iOS OpenGL的渲染管道。我的管道包含许多渲染步骤,因此我需要大量的中间纹理来渲染和读取。这些纹理有各种类型(无符号字节和半浮点数),并且可能拥有不同数量的通道。

为了节省内存和分配工作,我回收了管道中先前步骤使用的纹理,不再需要。在我之前的实现中,我自己做了。

在我的新实现中,我想使用Core Video框架提​​供的API;特别是因为它们可以更快地从C​​PU访问纹理内存。我知道CVOpenGLESTextureCache允许我从CVPixelBuffer创建可以直接创建或使用CVPixelBufferPool的OpenGL纹理。但是,我无法找到任何描述它们如何工作以及如何一起玩的文档。

以下是我想知道的事情:

  • 为了从CVOpenGLESTextureCache获取纹理,我总是需要提供一个像素缓冲区。如果我需要提供内存并且无法检索旧的,未使用的纹理,为什么它被称为“缓存”?
  • CVOpenGLESTextureCacheFlush函数“刷新当前未使用的资源”。缓存如何知道资源是否“未使用”?当我释放相应的CVOpenGLESTextureRef时,纹理是否返回到缓存?同样的问题适用于CVPixelBufferPool
  • 我能在一个纹理缓存中维护具有不同属性(类型,#channels,...)的纹理吗?是否知道是否可以重复使用纹理或根据我的要求创建纹理?
  • CVPixelBufferPool似乎只能管理相同大小和类型的缓冲区。这意味着我需要为我正在使用的每个纹理配置创建一个专用池,对吗?

如果至少可以澄清其中一些问题,我会非常高兴。

1 个答案:

答案 0 :(得分:0)

是的,你实际上找不到任何东西。我看了看,简短的回答是你只需要测试一下,看看实现的功能如何。您可以在opengl_write_texture_cache找到关于该主题的博客文章以及示例代码。基本上,它的工作方式似乎是纹理缓存对象“保持”缓冲区(在池中)与执行三角形渲染时绑定的OpenGL纹理之间的关联。结果是,在完成OpenGL之后,池不应该返回相同的缓冲区。在某种竞争条件的奇怪情况下,池可能会获得1个更大的缓冲区来解释持有时间过长的缓冲区。纹理缓存API的真正好处是,只需要一次写入数据缓冲区,而不是调用像glTexImage2D()那样将数据“上传”到图形卡的API。