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?
非常感谢!
事情是:我不能移动它们。每次在我的更新计时器开始调用一个方法时,我必须计算周围点的距离和标题。在这个之外,我计算了视图中的位置。由于我的显示器尺寸为320x480,我还必须检查点是否可见。 – Philip 2012-07-06 10:57:49
最好的事情是'360度视角'。我可以在启动应用程序时在该视图上绘制所有点,然后从左至右移动视图。但我绝对没有线索如何做到这一点:D – Philip 2012-07-06 11:00:10
很难说没有看到它+的细节(多少元素等)。如果这些只是一些标签块,那么我会认为一个自定义的UIView类可以工作 - 并且你可以优化一个la tableView:有一个数组(队列),所以你不必一直创建+销毁它们。 – 2012-07-06 11:04:09