Низкая производительность CGContextStrokePath при рисовании нескольких линий и кругов на iPhone - PullRequest
4 голосов
/ 09 июля 2010

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

Я подкласс (myView) из UIView и реализую функцию drawRect, чтобы сделать следующее ...

-(void) drawRect:(CGRect)rect {
   CGContextRef context = UIGraphicsGetCurrentContext();

   CGFloat red[4] = { 1, 0, 0, 1};

   CGContextSetLineWidth(context, 1);
   CGContextSetShouldAntialias(context, NO);
   CGContextSetLineCap(context, kCGLineCapSquare);
   CGContextSetStrokeColor(context, red);

   // rects is an array of CGRect of size ~200
   for (int i = 0; i < N; i++) {
      CGContextAddEllipseInRect(context, rects[i]);
   }
   // points is an array of CGPoint of size ~100
   CGContextAddLines(context, points, N);

   CGContextStrokePath(context, color);
}

Но это медленная собака. Есть что-то, чего я здесь не хватает? Создание одного полного чертежа занимает почти 1 секунду

1 Ответ

7 голосов
/ 09 июля 2010

Анимация объектов путем их перерисовки - плохой путь. Рисование кварца - одна из самых медленных вещей, которую вы можете сделать в пользовательском интерфейсе, из-за того, как работает система отображения.

Вместо этого вам нужно создать отдельные слои или виды для каждого элемента, который будет анимирован. Эти слои или виды будут нарисованы только один раз, а затем кэшированы. Когда слои перемещаются, они не будут перерисованы, а будут просто составлены. Сделано так, что даже самые медленные устройства iOS (оригинальный iPhone, iPhone 3G и iPod touch первого поколения) могут анимировать до 100 слоев со скоростью 60 кадров в секунду.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...