Понимание основных видео Семантика CVPixelBufferPool и CVOpenGLESTextureCache
Я занимаюсь рефакторингом своего конвейера рендеринга на базе iOS OpenGL. Мой конвейер состоит из множества шагов рендеринга, поэтому мне нужно много промежуточных текстур для рендеринга и чтения. Эти текстуры бывают разных типов (беззнаковый байт и половина с плавающей точкой) и могут иметь разное количество каналов.
Чтобы сэкономить память и усилия по выделению ресурсов, я переработал текстуры, которые использовались предыдущими шагами в конвейере и больше не нужны. В моей предыдущей реализации я делал это самостоятельно.
В моей новой реализации я хочу использовать для этого API, предоставляемые платформой Core Video; тем более что они обеспечивают гораздо более быстрый доступ к памяти текстур из процессора. Я понимаю что CVOpenGLESTextureCache
позволяет мне создавать текстуры OpenGL из CVPixelBuffer
ы, которые могут быть созданы непосредственно или с помощью CVPixelBufferPool
, Однако я не могу найти никакой документации, описывающей, как они действительно работают и как они играют вместе.
Вот то, что я хочу знать:
- Для получения текстуры из
CVOpenGLESTextureCache
Мне всегда нужно предоставить пиксельный буфер. Почему он называется "кеш", если мне все равно нужно предоставить память и я не могу восстановить старую неиспользуемую текстуру? -
CVOpenGLESTextureCacheFlush
функция "сбрасывает неиспользуемые в данный момент ресурсы". Как кеш узнает, если ресурс "не используется"? Будут ли текстуры возвращены в кеш при выпуске соответствующегоCVOpenGLESTextureRef
? Тот же вопрос относится кCVPixelBufferPool
, - Могу ли я поддерживать текстуры с разными свойствами (type, # channel, ...) в одном кеше текстур? Знает ли он, что текстуры можно использовать повторно или нужно создавать в зависимости от моего запроса?
CVPixelBufferPool
Кажется, что они могут управлять буферами одинакового размера и типа. Это означает, что мне нужно создать один выделенный пул для каждой конфигурации текстуры, которую я использую, правильно?
Я был бы очень рад, если бы хотя бы некоторые из этих вопросов можно было прояснить.
1 ответ
Да, на самом деле вы ничего не сможете найти. Я посмотрел и посмотрел, и короткий ответ: вам просто нужно проверить, как функционирует реализация. Вы можете найти мой пост в блоге на эту тему вместе с примером кода на http://www.modejong.com/blog/post12_opengl_write_texture_cache. По сути, кажется, что способ, которым он работает, заключается в том, что объект кэша текстуры "держит" связь между буфером (в пуле) и текстурой OpenGL, которая связана при выполнении рендеринга треугольника. В результате пул не должен возвращать один и тот же буфер до тех пор, пока с ним не будет завершен OpenGL. В странном случае какого-либо состояния гонки пул может получить на 1 буфер больше, чтобы учесть буфер, который удерживается слишком долго. Что действительно хорошо в API кеша текстур, так это то, что нужно всего лишь один раз записать в буфер данных, а не вызывать API, такой как glTexImage2D(), который "загружал" данные на видеокарту.