UIView drawRect:增强现实应用程序中的性能

时间:2012-07-06 10:38:07

标签: objective-c performance uiview drawrect

我现在正在构建一个增强现实应用程序,但遇到了一些问题:我的UIView。

首先,我会告诉你我的代码:

- (void)drawRect:(CGRect)rect {

CGContextRef context = UIGraphicsGetCurrentContext();
for(AREALocation *loc in self.locations) {
    CGContextSetLineWidth(context, 1.0);
    CGContextSetRGBStrokeColor(context, 0.0, 0.0, 0.0, 1.0);
    CGContextSetRGBFillColor(context, 0, 0.373, 0.659, 0.5);
    CGRect frame = CGRectMake(loc.point.x - 15, loc.point.y - 15, 30, 30);
    CGContextAddEllipseInRect(context, frame);
    CGContextDrawPath(context, kCGPathFillStroke);

    CGSize textSize = [loc.name sizeWithFont:[UIFont fontWithName:@"Helvetica" size:14]];

    CGContextSetRGBStrokeColor(context, 0, 0.373, 0.659, 1.0);
    CGContextSetRGBFillColor(context, 1.0, 1.0, 1.0, 1.0);

    CGRect textRect = CGRectMake(loc.point.x - textSize.width/2.0 - 4, loc.point.y + 20, textSize.width + 8, textSize.height + 2);        
    CGFloat radius = 5.0;

    CGFloat minx = CGRectGetMinX(textRect);
    CGFloat midx = CGRectGetMidX(textRect);
    CGFloat maxx = CGRectGetMaxX(textRect);
    CGFloat miny = CGRectGetMinY(textRect);
    CGFloat midy = CGRectGetMidY(textRect);
    CGFloat maxy = CGRectGetMaxY(textRect);
    CGContextMoveToPoint(context, minx, midy);
    CGContextAddArcToPoint(context, minx, miny, midx, miny, radius);
    CGContextAddArcToPoint(context, maxx, miny, maxx, midy, radius);
    CGContextAddArcToPoint(context, maxx, maxy, midx, maxy, radius);
    CGContextAddArcToPoint(context, minx, maxy, minx, midy, radius);
    CGContextClosePath(context);
    CGContextDrawPath(context, kCGPathFillStroke);

    CGContextSetRGBStrokeColor(context, 0.0, 0.0, 0.0, 1.0);
    CGContextSetRGBFillColor(context, 0.0, 0.0, 0.0, 1.0);        
    [loc.name drawInRect:CGRectMake(loc.point.x - textSize.width/2.0 + 1, loc.point.y + 21, textSize.width, textSize.height) withFont:[UIFont fontWithName:@"Helvetica" size:14]];
}
}

AREALoctions是一个类,它包含屏幕上"Point of interest"的具体位置以及有关名称的更多信息等。

问题是,必须每隔1 / 50.0秒调用UIView的[setNeedsDisplay](我使用NSTimer来执行此操作),以便在移动设备时显示点。特别是当阵列的大小增加时,drawRect:非常慢,因此会出现滞后。

您有什么想法可以提高drawRect:的效果吗?也许更喜欢CALayer而不是UIView?

非常感谢!

1 个答案:

答案 0 :(得分:1)

无法准确说出你在那里画的是什么 - 但是,是的,调用drawRect经常会导致严重滞后。为每个元素“整体”创建一个自定义UIView,然后只在需要时移动它们/更新文本等。

当然,完全取决于你画画的本质。