【发布时间】:2014-12-13 07:24:35
【问题描述】:
我正在重构基于 iOS OpenGL 的渲染管道。我的管道包含许多渲染步骤,因此我需要大量中间纹理来渲染和读取。这些纹理有多种类型(无符号字节和半浮点),并且可能拥有不同数量的通道。
为了节省内存和分配工作,我回收了管道中先前步骤使用且不再需要的纹理。在我之前的实现中,我是自己完成的。
在我的新实现中,我想为此使用 Core Video 框架提供的 API;特别是因为它们可以更快地从 CPU 访问纹理内存。我知道CVOpenGLESTextureCache 允许我从CVPixelBuffers 中创建OpenGL 纹理,这些纹理可以直接创建或使用CVPixelBufferPool 创建。但是,我找不到任何描述它们如何真正工作以及它们如何协同工作的文档。
以下是我想知道的事情:
- 为了从
CVOpenGLESTextureCache获取纹理,我总是需要提供一个像素缓冲区。如果我无论如何都需要提供内存并且无法检索旧的、未使用的纹理,为什么将其称为“缓存”? -
CVOpenGLESTextureCacheFlush函数“刷新当前未使用的资源”。缓存如何知道资源是否“未使用”?当我释放相应的CVOpenGLESTextureRef时,纹理是否返回缓存?同样的问题也适用于CVPixelBufferPool。 - 我能否在一个纹理缓存中维护具有不同属性(类型、# 通道、...)的纹理?它是否知道纹理是否可以重复使用或是否需要根据我的要求创建?
-
CVPixelBufferPools 似乎只能管理相同大小和类型的缓冲区。这意味着我需要为我使用的每个纹理配置创建一个专用池,对吗?
如果至少其中一些问题能得到澄清,我会非常高兴。
【问题讨论】:
标签: ios caching opengl-es textures core-video