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