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