CVOpenGLESTextureCache & CVMetalTextureCache правильное использование - PullRequest
0 голосов
/ 05 мая 2018

На 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 (...).

Мои вопросы:

  1. Сколько объектов CVOpenGLESTextureCache / CVMetalTextureCache мы можем создать? Есть ли скрытое снижение производительности при использовании нескольких объектов текстурного кэша в коде? Я вижу, что некоторые коды создают один глобальный кеш текстуры, а некоторые создают несколько объектов кеша текстуры.

  2. Код OpenGLES использует EAGLContext для создания кэша текстуры, что означает, что мы не можем повторно использовать один и тот же CVOpenGLESTextureCache в нескольких потоках. Однако, похоже, у нас может быть только один CVMetalTextureCache, который можно повторно использовать во всех потоках. Это действительно так?

  3. Я получаю возражение CVPixelBuffer от камеры с резервным копированием IOSurface. Я воссоздаю текстуру OpenGLES / Metal несколько раз для одного и того же CVPixelBuffer различными способами, возможно, используя другой объект кэша текстуры, и может быть в разных потоках. Это правильный путь с точки зрения производительности и управления памятью? Или я должен создать объекты текстуры OpenGLES / Metal раз и навсегда и передать текстуру нескольким методам?

...