Как напрямую обновлять пиксели - с CGImage и прямым CGDataProvider

Актуальный вопрос

Несколько ответов решат мою проблему:

  1. Могу ли я заставить CGImage перезагрузить свои данные от прямого поставщика данных (созданного с помощью CGDataProviderCreateDirect), как CGContextDrawImage? Или есть какой-то другой способ, которым я могу установить параметр self.layer.contents, чтобы сделать это?
  2. Существует ли конфигурация CGContext или прием, который можно использовать для визуализации изображений 1024x768 со скоростью не менее 30 кадров в секунду в соответствии с CGContextDrawImage литий>
  3. Кто-нибудь смог успешно использовать CVOpenGLESTextureCacheCreateTextureFromImage для обновления буфера в реальном времени с собственными данными текстуры? Я думаю, что моей самой большой проблемой является создание CVImageBuffer, когда я скопировал другие свойства из документации Apple для текстур. Если у кого-то есть какая-либо дополнительная информация по этому вопросу, это было бы здорово.
  4. Любые другие рекомендации по выводу изображения из памяти на экран со скоростью 30 кадров в секунду.

Фон (лоты):

Я работаю над проектом, в котором мне нужно изменить пиксели данных изображения NPOT в режиме реального времени (минимум 30 кадров в секунду) и нарисовать их на экране в iOS.

Моей первой мыслью было использовать OpenGL с glTexSubimage2D для обновления, к сожалению, это оказалось очень медленным (6 кадров в секунду на iPad), так как драйвер изливает и конвертирует мои данные RGB каждый кадр в BGR. Так что отправьте это в BGR, как вы говорите, и я тоже, но по какой-то причине вы не можете вызвать glTexSubImage2D с помощью GL_BGR перейти к цифре. Я знаю, что некоторая медлительность вызвана тем, что данные двух изображений не являются мощными, но мои требования диктуют это.

Дальнейшее чтение привело меня к CVOpenGLESTextureCacheCreateTextureFromImage, но во всех примерах используется прямой ввод с камеры для получения CVImageBufferRef Я пытался использовать документацию (пока нет официальных, только комментарии к заголовку), чтобы создать собственный CVImageBuffer для формирования данных моего изображения, но он не будет работать с этим (без ошибок, только пустая текстура в отладчике), что заставляет меня думать, что Apple построила это специально для обработки данных с камеры в реальном времени, и она не была протестирована за пределами этой области, кроме IDK.

В любом случае, после того как я оставил свое достоинство, бросив OpenGL и переключив свои мысли на CoreGraphics, меня привели к этому вопросу самый быстрый способ создания экранного буфера на iphone который рекомендует использовать CGImage при поддержке CGDataProviderCreateDirect , который позволяет вам возвращать указатель на данные изображения, когда это нужно CGImage, хорошо, верно? Ну, это не совсем так, как рекламируется. Если я использую CGContextDrawImage, тогда все работает. Я могу изменить пиксельный буфер, и при каждом рисовании он запрашивает данные изображения у моего поставщика данных, как и должен, вызывая методы в CGDataProviderDirectCallbacks (Note: они, кажется, имеют встроенную оптимизацию, игнорирует обновленный указатель, если он имеет тот же адрес, что и предыдущий). CGContextDrawImage не супер быстрый (около 18 кадров в секунду) даже с отключением интерполяции, что привело к тому, что это примерно с 6 кадров в секунду. Документы Apple говорят мне, что использование self.layer.contents будет намного быстрее, чем CGContextDrawImage. Использование self.layer.contents работает для первого назначения, но CGImage никогда не запрашивает перезагрузку у поставщика данных, как это делает CGContextDrawImage, даже когда я вызываю [layer setNeedsDisplay]. В вопросе SO, на который я ссылался, пользователь показывает свое решение проблемы, создавая и уничтожая новый CGImage из источника данных каждый кадр, безнадежно медленный процесс (да, я действительно пробовал), так что время для реального вопроса.

Примечание : я профилировал все эти операции и знаю, что проблема действительно в glTexSubImage для OpenGL и ---- +: = 24 =: + ---- на самом деле является проблемой CoreGraphics, поэтому нет ответов «перейти в профиль».

РЕДАКТИРОВАТЬ Исходный код, демонстрирующий эту технику, теперь можно найти по адресу http : //github.com/narpas/image-sequence-streaming

7 голосов | спросил Justin Meiners 30 AM00000030000004531 2012, 03:17:45

0 ответов


Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132