2012-07-06 44 views
0

我正在构建增强现实应用程序,但正在使用drawrect:我的UIView。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"在屏幕上的特定位置和这个名字更多的信息,等等

问题是,必须每隔1/50.0秒调用UIView的[setNeedsDisplay](我使用NSTimer来做到这一点),以便在移动设备时显示点。特别是当阵列的尺寸越来越大时,drawRect:非常缓慢,所以会出现延迟。您对drawRect:的性能有什么提示?也许更喜欢CALayer over UIView?

非常感谢!

回答

1

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

当然,完全取决于您绘制的内容。

+0

事情是:我不能移动它们。每次在我的更新计时器开始调用一个方法时,我必须计算周围点的距离和标题。在这个之外,我计算了视图中的位置。由于我的显示器尺寸为320x480,我还必须检查点是否可见。 – Philip 2012-07-06 10:57:49

+0

最好的事情是'360度视角'。我可以在启动应用程序时在该视图上绘制所有点,然后从左至右移动视图。但我绝对没有线索如何做到这一点:D – Philip 2012-07-06 11:00:10

+0

很难说没有看到它+的细节(多少元素等)。如果这些只是一些标签块,那么我会认为一个自定义的UIView类可以工作 - 并且你可以优化一个la tableView:有一个数组(队列),所以你不必一直创建+销毁它们。 – 2012-07-06 11:04:09