Как быстрее подтолкнуть пиксели на iPhone? - PullRequest
3 голосов
/ 11 октября 2008

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

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()%256;
}
CGRect rect = CGRectMake(0, 0, 320, 480);
CGContextDrawImage(context, rect, ir); 

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

Ответы [ 4 ]

2 голосов
/ 12 октября 2008

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

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

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

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

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

1 голос
/ 22 декабря 2009

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

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

Да, я знаю, что это старый, я наткнулся на это из Google

1 голос
/ 11 октября 2008

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

1 голос
/ 11 октября 2008

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

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

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

...