На 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
}
и затем мы создаем текстуру OpenGLES из CVPixelBuffer, используя CVOpenGLESTextureCacheCreateTextureFromImage (...) API.
Поток металла точно такой же, сначала создайте CVMetalTextureCache
if CVMetalTextureCacheCreate(kCFAllocatorDefault, nil, device!, nil, &metalTextureCache) == kCVReturnSuccess {
}
, а затем создайте текстуру металла из CVPixelBuffer с помощью API CVMetalTextureCacheCreateTextureFromImage (...).
Мои вопросы:
Сколько объектов CVOpenGLESTextureCache / CVMetalTextureCache мы можем создать? Есть ли скрытое снижение производительности при использовании нескольких объектов текстурного кэша в коде? Я вижу, что некоторые коды создают один глобальный кеш текстуры, а некоторые создают несколько объектов кеша текстуры.
Код OpenGLES использует EAGLContext для создания кэша текстуры, что означает, что мы не можем повторно использовать один и тот же CVOpenGLESTextureCache в нескольких потоках. Однако, похоже, у нас может быть только один CVMetalTextureCache, который можно повторно использовать во всех потоках. Это действительно так?
Я получаю возражение CVPixelBuffer от камеры с резервным копированием IOSurface. Я воссоздаю текстуру OpenGLES / Metal несколько раз для одного и того же CVPixelBuffer различными способами, возможно, используя другой объект кэша текстуры, и может быть в разных потоках. Это правильный путь с точки зрения производительности и управления памятью? Или я должен создать объекты текстуры OpenGLES / Metal раз и навсегда и передать текстуру нескольким методам?