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