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

Actual Question

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

Can I force a CGImage to reload its data from a direct data provider (created with CGDataProviderCreateDirect) like CGContextDrawImage does? Or is there some other way I can get setting to self.layer.contents to do it? Is there a CGContext configuration, or trick I can use to render 1024x768 images at least 30 fps consistently with CGContextDrawImage. Has anyone been able to successfully use CVOpenGLESTextureCacheCreateTextureFromImage for realtime buffer updates with their own texture data? I think my biggest problem is creating a CVImageBuffer as I copied the other properties from Apples' documentation for textures. If anyone has any more information on this that would be awesome. Any other guidelines on how I can get an image from memory onto the screen at 30 fps.

Background (lots):

Я работаю над проектом, в котором мне нужно изменить пиксели данных изображения 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 из источника данных каждый кадр, безнадежно медленный процесс (да, я действительно пробовал), так что время для реального вопроса.

Note: Я профилировал все эти операции и знаю, что проблема действительноglTexSubImage для OpenGL иCGContextDrawImage На самом деле это проблема CoreGraphics, так что не переходите в профиль. ответы.

EDIT Исходный код, демонстрирующий эту технику, теперь можно найти по адресуhttp://github.com/narpas/image-sequence-streaming

Ответы на вопрос(1)

Ваш ответ на вопрос