2

关于 CVOpenGLESTextureCache 和 CVMetalTextureCache 的文档很少,更具体地说是关于它们的正确用法。为了将 CVPixelBuffer 映射到 OpenGLES 纹理,我们创建纹理缓存如下:

 let err = CVOpenGLESTextureCacheCreate(kCFAllocatorDefault, nil, oglContext as CVEAGLContext, nil, &textureCache)
        if err != 0 {
            NSLog("Error at CVOpenGLESTextureCacheCreate %d", err)
            success = false
            break bail
        }

然后我们使用 CVOpenGLESTextureCacheCreateTextureFromImage(...) API 从 CVPixelBuffer 创建一个 OpenGLES 纹理。

Metal flow完全一样,先创建CVMetalTextureCache

  if CVMetalTextureCacheCreate(kCFAllocatorDefault, nil, device!, nil, &metalTextureCache) == kCVReturnSuccess {

  }

然后使用 CVMetalTextureCacheCreateTextureFromImage(...) API 从 CVPixelBuffer 创建金属纹理。

我的问题:

  1. 我们可以创建多少个 CVOpenGLESTextureCache/CVMetalTextureCache 对象?在代码中使用多个纹理缓存对象是否存在隐藏的性能损失?我看到一些代码创建一个全局纹理缓存,而一些代码创建多个纹理缓存对象。

  2. OpenGLES 代码使用 EAGLContext 创建纹理缓存,这意味着我们不能在多个线程上重用相同的 CVOpenGLESTextureCache。然而,看起来我们只能有一个 CVMetalTextureCache 可以在所有线程中重用。真的是这样吗?

  3. 我从支持 IOSurface 的相机中得到了 CVPixelBuffer 的反对。我正在以不同的方法为同一个 CVPixelBuffer 多次重新创建 OpenGLES/Metal 纹理,可能使用不同的纹理缓存对象,并且可能位于不同的线程上。从性能和内存管理的角度来看,这是正确的做事方式吗?或者我应该一劳永逸地创建 OpenGLES/Metal 纹理对象并将纹理提供给多个方法?

4

0 回答 0