2008-10-11 7 views
3

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

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); 

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

ответ

2

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

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

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

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

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

+0

Ok, профилированные немного. Кажется, он раскололся довольно равномерно, даже если я вообще не выполняю настройку rand() и просто вызываю CGContextDrawImage, все еще 50% процессора расходуется. Я постараюсь выяснить, не ускорит ли ваши другие предложения. – Bemmu 2008-10-13 02:45:38

1

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

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

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

1

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

1

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

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

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