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