Низкая производительность устройства при перерисовке представлений - PullRequest
0 голосов
/ 17 января 2012

Я использую NSTimer для обновления 5 контекстов и вставки их в 5 представлений каждые 0,03 секунды. Это отлично работало в симуляторе и работало с большой частотой кадров, но затем запускалось на iPod. Я понизил курс до .1 и увидел небольшое улучшение. Есть ли более эффективный способ перерисовки этих контекстов?

Код:

- (void)addViews{
[self.superview addSubview:mag];
[self.superview addSubview:vc];
[self.superview addSubview:na];
[self.superview addSubview:wave];
[self.superview addSubview:mon];

[self.superview addSubview:selector];

looper = [NSTimer timerWithTimeInterval:0.03
                                target:self
                               selector:@selector(setNeeds)
                               userInfo:nil
                                repeats:YES];

[[NSRunLoop mainRunLoop] addTimer:looper forMode:NSRunLoopCommonModes];
}

-(void)setNeeds{
[mag setNeedsDisplay];
[vc setNeedsDisplay];
[na setNeedsDisplay];
[wave setNeedsDisplay];
[mon setNeedsDisplay];
}

Это настройка контекста, применяемая к каждому представлению. По сути увеличительное стекло.

- (void)drawRect:(CGRect)rect {
CGPoint magnifiedPoint = [viewToMagnify convertPoint:coordPoint fromView:self.superview];

CGContextRef context = UIGraphicsGetCurrentContext();
CGContextTranslateCTM(context,(self.frame.size.width*0.5),(self.frame.size.height*0.5));
CGContextScaleCTM(context, 1.3, 1.3);
CGContextTranslateCTM(context,-1*(magnifiedPoint.x),-1*(magnifiedPoint.y));
[self.viewToMagnify.layer renderInContext:context];
}

1 Ответ

1 голос
/ 19 января 2012

Core Graphics рисует относительно медленно, потому что не использует аппаратное ускорение с использованием OpenGL. Core Graphics слишком медленный для анимации в реальном времени на iOS.

Базовая анимация намного быстрее, потому что она использует аппаратное ускорение OpenGL. Я предлагаю попытаться добиться вашего эффекта с помощью Core анимации в максимально возможной степени. Каждый UIView поддерживается CALayer, поэтому любые преобразования, которые вы применяете непосредственно к свойству view.transform, будут очень быстрыми. Вы также можете динамически маскировать вид, используя изображение, установив свойство view.layer.mask.

Возможно, вы могли бы смоделировать эффект увеличения, масштабируя само представление (или копию представления с тем же содержимым) и маскируя его в круг. Таким образом, вам никогда не придется вызывать renderInContext или делать какие-либо рисунки CGContext, и все это должно работать с приличной частотой кадров.

...