【问题标题】:Understanding Core Videos CVPixelBufferPool and CVOpenGLESTextureCache semantics理解核心视频 CVPixelBufferPool 和 CVOpenGLESTextureCache 语义
【发布时间】: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


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2012-06-29
      • 2011-06-27
      • 2018-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-05
      • 1970-01-01
      相关资源
      最近更新 更多