2009-12-09 3 views
0

У меня есть последовательность изображений, необходимых для отображения за короткое время (последовательность PNG). Всего насчитывается 31 PNG, каждый из которых имеет размер файла около 45 КБ. Я уже загрузил их со следующими кодами:Предварительная загрузка изображений в приложении для iPhone?

imgArray = [[NSMutableArray alloc] init]; 
for(int i = 0; i <= 30; i++) { 
    NSString * filename = [NSString stringWithFormat:@"img_000%.2d.png", i]; 
    UIImage *temp = [UIImage imageNamed:filename]; 
    [imgArray addObject:temp]; 
    [temp release]; 
    temp = nil; 
} 

я использую следующие коды для отображения изображений:

CGImageRef image = [(UIImage *)[imgArray objectAtIndex:imgFrame] CGImage]; 
imgLayer.contents = (id)image; 
if(imgFrame < 29) { 
    imgFrame++; 
} else { 
    imgFrame = 0; 
    imgLayer.hidden = TRUE; 
    [imgTimer invalidate]; 
} 

где imgLayer является CALayer. (imgTimer - это повторяющийся таймер с интервалом 0.03s)

Но я обнаружил, что, когда я вызываю изображения, он очень лаги в первый раз. Кроме первого появления, у другого внешнего вида нет проблем.

Это связано с предварительной загрузкой изображений? Или мои изображения слишком велики в размере файла?

+0

Я не думаю, что это поможет вашей конкретной проблеме, но может быть неплохой идеей переместить объявления переменных за пределами цикла for. Я не знаю, достаточно ли gcc достаточно, чтобы это исправить, но смотреть на это довольно болезненно. – KevinDTimm

ответ

0

Причина ваших задержек трудно описать без профилирования данных. Но вот трюк, который может помочь: Присоедините все свои изображения в один большой файл. Попробуйте сделать его прямоугольным (возможно, 6x6 в вашем случае или 4 * 8). Затем загрузите этот единственный файл и обрезайте каждое изображение для отображения (т. Е. Создайте изображение для отображения с размером плитки и скопируйте один фрагмент из большого изображения после другого в отображаемое изображение).

+0

Как лист спрайтов? Хорошо, я постараюсь. Тем не менее, мои PNG все размером 480 x 500 пикселей; если я присоединяюсь к ним, это будет огромный образ, о котором я не думаю, что iPhone может справиться. Возможно, я должен уменьшить размер моих изображений. – Raptor

+0

Да, как лист спрайтов. Кроме того, если вам нужно их оживить, подумайте о том, чтобы использовать анимированный формат (например, AVI или * shudder * anim GIF или MNG). IPhone может воспроизводить видео с полным разрешением экрана без проблем. –

+0

Идея листа спрайтов разумна, но вы отвечаете на другой вопрос. И загрузка большего спрайт-файла не должна занимать гораздо меньше времени. –

0

Изображения загружаются, когда они используются и отображаются. Если вы используете профилировщик времени в Инструментах, вы будете испытывать лаг. Если вы затем увеличите масштаб до этого запаздывания и посмотрите, что его вызывает, вы обычно увидите, что «copyImageBlockSetPNG» - это функция, требующая времени, прямо перед «раздуванием».

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