CVOpenGLESTextureCache& CVMetalTextureCache正确用法

时间:2018-05-04 21:05:55

标签: ios opengl-es avfoundation core-video cvpixelbuffer

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纹理。

金属流完全相同,首先创建CVMetalTextureCache

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

  }

然后使用CVMetalTextureCacheCreateTextureFromImage(...)API从CVPixelBuffer创建Metal Texture。

我的问题:

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

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

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

0 个答案:

没有答案