Как быстрее перемещать пиксели на iPhone?

#iphone #framebuffer #pixels

Вопрос:

Я уже спрашивал раньше о переносе пикселей, и теперь мне удалось зайти достаточно далеко, чтобы на экране появился шум. Вот как я ввел:

 CGDataProviderRef provider;
bitmap = malloc(320*480*4);
provider = CGDataProviderCreateWithData(NULL, bitmap, 320*480*4, NULL);
CGColorSpaceRef colorSpaceRef;
colorSpaceRef = CGColorSpaceCreateDeviceRGB();
ir = CGImageCreate(
320,
480,
8,
32,
4 * 320,
colorSpaceRef,
kCGImageAlphaNoneSkipLast,
provider,
NULL,
NO,
kCGRenderingIntentDefault
);
 

Вот как я визуализирую каждый кадр:

 for (int i=0; i<320*480*4; i  ) {
bitmap[i] = rand()%6;
}
CGRect rect = CGRectMake(0, 0, 320, 480);
CGContextDrawImage(context, rect, ir); 
 

Проблема в том, что это ужасно, ужасно медленно, около 5 кадров в секунду. Я думаю, что мой путь к публикации буфера должен быть неправильным. Возможно ли вообще создать полноэкранную пиксельную графику, которую я мог бы обновлять со скоростью 30 кадров в секунду, без использования 3D-чипа?

Ответ №1:

Медлительность почти наверняка связана с генерацией шума. Если вы запустите это в инструментах, вы, вероятно, увидите, что уйма времени уходит на то, чтобы сидеть в своем цикле.

Еще одна небольшая проблема-это ваше цветовое пространство. Если вы используете цветовое пространство экрана, вы избежите преобразования цветового пространства, которое потенциально дорого.

Если вы можете использовать процедуры CoreGraphics для своего рисунка, вам будет лучше создать слой CGLayer для контекста рисунка вместо того, чтобы каждый раз создавать новый объект.

Компонент bytesPerRow также важен для производительности. Это должно быть в 32 раза больше IIRC. Есть некоторый код, доступный текст ссылки, который показывает, как его вычислить.

И да, для сырой производительности, OpenGL.

Комментарии:

1. Хорошо, немного профилирован. Похоже, он разделен довольно равномерно, даже если я вообще не выполняю никаких настроек rand() и просто вызываю CGContextDrawImage, все равно тратится 50% процессора. Я постараюсь посмотреть, не сделают ли ваши другие предложения это быстрее.

Ответ №2:

Я подозреваю 320*480*4 , что запись в память 614400 (), генерация случайных чисел и создание нового объекта в каждом кадре замедляют вас.

Вы пробовали просто написать статическое растровое изображение на экран и посмотреть, насколько это быстро? Возможно, вы пробовали профилировать код? Вам также нужно каждый раз создавать новую CGRect?

Если вы просто хотите создать эффект случайности, вероятно, нет необходимости каждый раз восстанавливать все растровое изображение.

Ответ №3:

Насколько мне известно, OpenGL должен быть самым быстрым способом создания графики на iPhone. Это включает в себя 2D и 3D. UIView поддерживается основным слоем анимации, который в любом случае заканчивается рисованием с помощью OpenGL. Так почему бы не пропустить посредника.

Ответ №4:

Вы можете избежать поездки , CGContextDrawImage назначив свое CGImageRef -[CALayer setContents:] кому, просто убедитесь, что не освобождаете растровое изображение, пока вы все еще используете его.

 [[view layer] setContents:(id)ir];
 

Да, я знаю, что это старое, я наткнулся на это в Google