重绘视图时设备性能不佳

时间:2012-01-17 19:32:58

标签: ios cocoa-touch uikit nstimer

我正在使用NSTimer刷新5个上下文并将它们粘贴到每个.03秒的5个视图中。这在模拟器中运行良好,并以很高的帧速率运行,但是当部署在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 个答案:

答案 0 :(得分:1)

核心图形绘制相对较慢,因为它不是使用OpenGL进行硬件加速。除了最琐碎的绘图之外,Core Graphics对于iOS上的实时动画来说太慢了。

核心动画速度更快,因为它使用OpenGL硬件加速。我建议尽可能使用Core动画来达到你的效果。每个UIView都有一个CALayer支持,因此您直接应用于view.transform属性的任何变换都将非常快。您还可以通过设置view.layer.mask属性来动态屏蔽视图。

也许您可以通过缩放视图本身(或具有相同内容的视图副本)并将其遮盖为圆形来模拟放大效果。这样你就不必调用renderInContext或者做任何CGContext绘图,整个事情应该以合适的帧速率运行。