Как эффективно показать много Изображений? (программирование iPhone)

В моем приложении мне было нужно что-то как система частиц, таким образом, я сделал следующее:

В то время как приложение инициализирует, я загружаю UIImage

laserImage = [UIImage imageNamed:@"laser.png"];

UIImage *laserImage объявляется в Интерфейсе моего Контроллера. Теперь каждый раз, когда мне нужна новая частица, этот код делает тот:

// add new Laserimage
UIImageView *newLaser = [[UIImageView alloc] initWithImage:laserImage];
[newLaser setTag:[model.lasers count]-9];
[newLaser setBounds:CGRectMake(0, 0, 17, 1)];
[newLaser setOpaque:YES];
[self.view addSubview:newLaser];
[newLaser release];

Заметьте, что изображения составляют только 17 пкс *, маленький 1 пкс и model.lasers является внутренним массивом, чтобы сделать все вычисление, разделенное от вывода графических данных. Таким образом в моем основном цикле рисунка я установил позиции всего UIImageView на расчетные положения в моем массиве model.lasers:

for (int i = 0; i < [model.lasers count]; i++) {
    [[self.view viewWithTag:i+10] setCenter:[[model.lasers objectAtIndex:i] pos]];
}

Я увеличил теги 10, потому что значение по умолчанию 0, и я не хочу перемещать все представления с тегом по умолчанию.

Таким образом, анимация выглядит хорошо приблизительно с 10 - 20 изображениями, но действительно становится медленной при работе приблизительно с 60 изображениями. Таким образом, мой вопрос: там какой-либо путь состоит в том, чтобы оптимизировать это, не начиная в OpenGl ES?

9
задан Andy Obusek 30 December 2012 в 07:27
поделиться

4 ответа

Как сказали jeff7 и FenderMostro, вы используете высокоуровневый API (UIKit), и у вас будет лучшая производительность при использовании более низких API, CoreAnimation или OpenGL. (cocos2d построен на основе OpenGL)

  • Лучшим вариантом было бы использовать CALayers вместо UIImageViews, получить CGImageRef из вашего UIImage и установить его в качестве содержимого для этих слоев.

  • Кроме того, вы можете захотеть сохранить пул CALayers и повторно использовать их, скрывая / отображая по мере необходимости. 60 CALayers 17 * 1 пикселей - это немного, я делал это с сотнями из них без дополнительной оптимизации.

Таким образом, изображения будут уже распакованы и доступны в видеопамяти. При использовании UIKit все происходит через ЦП, не говоря уже о создании UIViews, которые являются довольно тяжелыми объектами.

8
ответ дан 3 November 2019 в 00:00
поделиться

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

См. здесь .

1
ответ дан 3 November 2019 в 00:00
поделиться

Я бы порекомендовал начать с использования OpenGL ES, есть отличная среда под названием cocos2d для iPhone , которая может сделать этот тип программирования очень простым и быстрым. Взглянув на ваш код, вы поймете, что ваши лазеры можно преобразовать в CCSprite , что является простым способом перемещения изображений по сцене среди многих других вещей.

0
ответ дан 3 November 2019 в 00:00
поделиться

Похоже, вы пытаетесь закодировать игру, используя UIKit API, который на самом деле не очень подходит для такого рода целей. Вы расходуете ресурсы устройства всякий раз, когда выделяете UIView, что приводит к замедлению работы, поскольку создание объекта обходится дорого. Возможно, вы сможете получить желаемую производительность, перейдя к CoreAnimation, который действительно хорош для рисования сотен изображений за ограниченный период времени, хотя было бы намного лучше, если бы вы использовали OpenGL или такой движок, как Cocos2d.

3
ответ дан 3 November 2019 в 00:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: