ios - 了解核心视频 CVPixelBufferPool 和 CVOpenGLESTextureCache 语义

标签 ios caching opengl-es textures core-video

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

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

在我的新实现中,我想为此使用核心视频框架提供的 API;特别是因为它们可以更快地从 CPU 访问纹理内存。我知道 CVOpenGLESTextureCache允许我用 CVPixelBuffer 创建 OpenGL 纹理可以直接创建或使用 CVPixelBufferPool 创建的 s .但是,我无法找到任何描述它们如何真正工作以及如何协同工作的文档。

以下是我想知道的事情:

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

如果至少其中一些问题能够得到澄清,我会非常高兴。

最佳答案

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

关于ios - 了解核心视频 CVPixelBufferPool 和 CVOpenGLESTextureCache 语义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26429621/

相关文章:

ios - 调整 UITableViewCell 的大小以适应内容性能

asp.net-mvc - 什么是缓存配置文件?

caching - 即使使用无缓存元标记也能缓存 BlackBerry 浏览器

iphone - 是否有关于如何使用 OpenGL 纹理模糊的教程或简化示例?

ios - 使用着色器的 Cocos2d 模糊

ios - 未捕获的异常“NSFileHandleOperationException”

ios - 将 GLKView 嵌套到 UIViewController 中

ios - 如何在解析中使用手机号码登录,但用户应该通过短信或调用该号码获取验证码?

android - Gradle 离线如何缓存依赖项

opengl-es - 不带 ftransform() 的桌面 GLSL