0

現在、拡張現実アプリを構築していますが、UIView の drawrect: に問題があります。

まず、私のコードを示します。

- (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"画面上の の特定の位置と、名前に関するその他の情報などを含むクラスです。

問題は、[setNeedsDisplay]デバイスの移動中にポイントを表示するために、UIView を 1/50.0 秒ごとに呼び出す必要があることです (これには NSTimer を使用します)。特に配列のサイズが大きくなると、drawRect:非常に遅くなり、ラグが発生します。

のパフォーマンスを向上させるためのアイデアはありdrawRect:ますか? 多分UIViewよりもCALayerを好むでしょうか?

どうもありがとうございました!

4

1 に答える 1

1

そこに何を描いているのか正確にはわかりませんが、そうです、頻繁にdrawRectを呼び出すと、大きな遅延が発生します。要素ごとにカスタムUIViewを作成し、「全体」を作成してから、必要な場合にのみ要素を移動したり、テキストを更新したりします。

もちろん、あなたが描いているものの性質に完全に依存します。

于 2012-07-06T10:47:32.930 に答える