Самый простой и быстрый способ визуализации UIImage / PNG с использованием OpenGL на iPhone? - PullRequest
1 голос
/ 26 сентября 2010

Я написал приложение для iPhone, которое принимает ввод от пользователя и обновляет растровый контекст на основе ввода.После обновления он обновляет отображение UIView.Я добиваюсь этого путем реализации drawRect в подклассе UIView.

В настоящее время я использую Quartz 2D.Учитывая, что обновления происходят несколько раз в секунду, я заметил, что хотя приложение хорошо работает в эмуляторе, оно намного медленнее (хотя и не используется) на реальном устройстве.Я хотел бы переписать drawRect, чтобы использовать вместо него OpenGL (как я слышал, это намного более производительно?).Если у вас есть другие идеи, я весь в ушах.

Я просмотрел в Интернете примеры / учебные пособия о том, как просто отобразить PNG с использованием OpenGL, но большинство из них излишни в том, что мне нужно.Я ищу короткий и приятный пример для быстрого взятия PNG-файла или UIImage, а затем рендеринга этого в UIView с использованием OpenGL (осуществимо ли это вообще концептуально даже имеет смысл?) - или указателя на документацию для ускорения рендеринга изображенийиспользуя существующие API-интерфейсы Quartz.

Прежде чем вы решите ответить с ответом RTFM - пожалуйста, не тратьте мое или ваше время.Я не ищу ярлык, я не против делать домашнее задание.Я просто ищу простое решение / руководство, которое соответствует моим потребностям и которое трудно найти.Я уверен, что кто-то, кто хорошо разбирается в OpenGL, может объяснить, что нужно сделать, и запустить этот код за 5 минут.Если это ты, это сделает мой день :).

Любая помощь, руководство и т. Д. Всегда приветствуются.Спасибо.

Ответы [ 2 ]

3 голосов
/ 26 сентября 2010

Создайте растровый контекст с памятью, которую вы выделили себе

void* data = malloc(width*height*4);

CGContextRef ctx = CGBitmapContextCreate( . . . );

и визуализируйте все, что вы хотите, в этот растровый контекст.Затем создайте текстуру из данных

glGenTextures(1, &texref);
glBindTexture(GL_TEXTURE_2D, texref);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, data);

Теперь просто следуйте любой инструкции по визуализации этой текстуры с помощью GL, используя пример кода Apple о том, как визуализировать GL в UIView.Будьте осторожны, что вы используете порядок байтов RGBA в контексте растрового изображения (или поменяйте местами вызов GL на ARGB).Кроме того, помните, что GL любит только текстуры с размерами 2 ^ nx 2 ^ n.

С архитектурой разделяемой памяти iPhone, данные не отправляются на графическую карту каждый цикл, так что это не сильноштрафа за производительность.

1 голос
/ 26 сентября 2010

Более быстрый способ отображения обновленного растрового изображения может состоять в том, чтобы просто назначить контекст растрового изображения для CALayer UIView (размер подпредставления и / или преобразованный в желаемый прямоугольник назначения при необходимости). Рендеринг фрейма drawRect или OpenGL не требуется.

...