Как напрямую обновлять пиксели - с CGImage и прямым CGDataProvider
Actual Question
Несколько ответов решат мою проблему:
Can I force aCGImage
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