我正在重构基于iOS OpenGL的渲染管道。我的管道包含许多渲染步骤,因此我需要很多中间纹理来渲染和读取。这些纹理具有各种类型(无符号字节和半浮点数),并且可能具有不同数量的通道。
为了节省内存和分配工作,我回收了管道中先前步骤使用的纹理,不再需要它们。在我以前的实现中,我是自己做的。
在我的新实现中,我想使用Core Video框架提供的API。特别是因为它们提供了从CPU对纹理内存的更快访问。我知道 CVOpenGLESTextureCache
允许我从 CVPixelBuffer
之外创建OpenGL纹理,可以直接创建或使用 CVPixelBufferPool
来创建。但是,我找不到任何描述它们如何真正发挥作用以及如何共同发挥作用的文档。
这是我想知道的事情:
CVOpenGLESTextureCache
获取纹理,我总是需要提供一个像素缓冲区。如果仍然需要提供内存并且无法检索旧的未使用的纹理,为什么将其称为“缓存”? CVOpenGLESTextureCacheFlush
函数“清除当前未使用的资源”。缓存如何知道资源是否“未使用”?当我释放相应的CVOpenGLESTextureRef
时,纹理是否返回到缓存中?同样的问题也适用于CVPixelBufferPool
。 CVPixelBufferPool
似乎只能管理相同大小和类型的缓冲区。这意味着我需要为我使用的每种纹理配置创建一个专用池,对吗? 如果至少可以澄清其中一些问题,我将非常高兴。
最佳答案
是的,那么您实际上将无法找到任何东西。我看了看,简短的回答是,您只需要测试一下内容即可了解实现的功能。您可以在opengl_write_texture_cache上找到有关该主题的博客文章以及示例代码。基本上,似乎它的工作方式是纹理缓存对象“保持”缓冲区(在池中)与执行三角形渲染时绑定的OpenGL纹理之间的关联。结果是直到完成OpenGL之后,池才应返回相同的缓冲区。在某种竞争条件的怪异情况下,池可能会增加1个缓冲区,以说明缓冲区保持的时间太长。纹理缓存API的真正好处是,只需要写入一次数据缓冲区,而不是调用诸如glTexImage2D()这样的API,该API会将数据“上传”到图形卡。