ipad scrollview вызывает malloc в 40 раз больше размера изображения - PullRequest
2 голосов
/ 23 июля 2010

Имейте в виду меня, поскольку я новичок в obj-c, но у меня есть UIScrollView и сегментированная кнопка, которая переключается между 2 изображениями, которые представлены в просмотре прокрутки. Каждое изображение имеет большой размер около 500 КБ, но каждое из них вызывает выделение более 20 МБ и приводит к сбою моего приложения.

     - (void)viewDidLoad {
 [bvpiscrollview setContentSize:CGSizeMake(768, 2484)];
 UIImage *loadBvImage = [UIImage imageNamed:@"bpi_1536x4965v2.png"];
 bvpiimg.image = loadBvImage;
 [loadBvImage release];
 [super viewDidLoad];
}
-(UIView *)viewForZoomingInScrollView:bvpiscrollview{
 return bvpiimg;
}

-(IBAction)pidonebutton{
 [self.view removeFromSuperview];
}

-(IBAction)segmentedControlIndexChanged{
 switch (self.segmentedControl.selectedSegmentIndex)
 {
  case 0:
   [bvpiscrollview setContentSize:CGSizeMake(768, 2484)];
   UIImage *loadBvImage = [UIImage imageNamed:@"bpi_1536x4965v2.png"];
   bvpiimg.image = loadBvImage;
   [loadBvImage release];
   break;
  case 1:
   [bvpiscrollview setContentSize:CGSizeMake(768, 2556)];
   UIImage *loadMpImage = [UIImage imageNamed:@"mpi_1536x5110v2.png"];
   bvpiimg.image = loadMpImage;
   [loadMpImage release];
  default:
   break;

 }
}
- (void)dealloc {
 [bvpiimg release];
 [bvpiscrollview release];
 [segmentedControl release];
    [super dealloc];
}
@end

Ответы [ 3 ]

4 голосов
/ 23 июля 2010

500K RGBA изображение будет иметь площадь около 350 пикселей.Размер изображения RGBA 1536 x 5110 пикселей составляет около 31,4 МБ.Вы, кажется, путаете размер изображения с размером файла.

Наибольший размер, поддерживаемый на всех устройствах iOS, составляет 1024 пикселя сбоку, хотя некоторые поддерживают большие размеры.Попробуйте разрезать ваши большие изображения на меньшие плитки, прежде чем добавлять их в представление в иерархии представлений.Вы можете сократить изображение во время выполнения с помощью серии вызовов до CGImageCreateWithImageInRect.Я обычно выбираю плитки размером 512 пикселей или меньше.

1 голос
/ 23 июля 2010

Некоторая справочная информация для вас взята из здесь :

На фронте скорости существует общее недопонимание того, что происходит.Самая большая вещь, которую + imageNamed: делает - это декодирует данные изображения из исходного файла, что почти всегда значительно увеличивает размер данных (например, PNG-файл с размером экрана может сжать несколько десятков КБ при сжатии, но потребляет более половины МБ)распакованный - ширина * высота * 4).В отличие от + imageWithContentsOfFile: распаковывает это изображение каждый раз, когда нужны данные изображения.Как вы можете себе представить, если вам нужны только данные изображения один раз, вы ничего не выиграете, за исключением того, что у вас будет кешированная версия изображения, вероятно, дольше, чем вам нужно.Однако, если у вас есть большое изображение, которое нужно часто перерисовывать, есть альтернативы, хотя я бы рекомендовал в первую очередь избегать перерисовки этого большого изображения:).

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

Вы можете попробовать отключить оптимизацию изображения, как было здесь , или попробовать другой формат изображения, отличный от PNG.

0 голосов
/ 23 июля 2010

Не загружайте такие большие изображения с помощью [UIImage imageNamed:].Найдите путь к пакету и загрузите их из него с помощью [UIImage imageWithPath].

...