关于 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 创建金属纹理。
我的问题:
我们可以创建多少个 CVOpenGLESTextureCache/CVMetalTextureCache 对象?在代码中使用多个纹理缓存对象是否存在隐藏的性能损失?我看到一些代码创建一个全局纹理缓存,而一些代码创建多个纹理缓存对象。
OpenGLES 代码使用 EAGLContext 创建纹理缓存,这意味着我们不能在多个线程上重用相同的 CVOpenGLESTextureCache。然而,看起来我们只能有一个 CVMetalTextureCache 可以在所有线程中重用。真的是这样吗?
我从支持 IOSurface 的相机中得到了 CVPixelBuffer 的反对。我正在以不同的方法为同一个 CVPixelBuffer 多次重新创建 OpenGLES/Metal 纹理,可能使用不同的纹理缓存对象,并且可能位于不同的线程上。从性能和内存管理的角度来看,这是正确的做事方式吗?或者我应该一劳永逸地创建 OpenGLES/Metal 纹理对象并将纹理提供给多个方法?