Iphone Toubleshooting地图套件性能

Iphone Toubleshooting地图套件性能,iphone,objective-c,cocoa-touch,mapkit,Iphone,Objective C,Cocoa Touch,Mapkit,我正在使用mapkit在地图上绘制500多个点。与原生的谷歌地图应用相比,缩放有点紧张。我已经发现是什么导致了这种缓慢。我正在添加自定义注释,以便以后可以为详图视图添加不同的管脚颜色和按钮: - (MKAnnotationView *) mapView:(MKMapView *)mapView viewForAnnotation:(AddressNote *) annotation { MKPinAnnotationView *annView=[[MKPinAnnotationView

我正在使用mapkit在地图上绘制500多个点。与原生的谷歌地图应用相比,缩放有点紧张。我已经发现是什么导致了这种缓慢。我正在添加自定义注释,以便以后可以为详图视图添加不同的管脚颜色和按钮:

- (MKAnnotationView *) mapView:(MKMapView *)mapView viewForAnnotation:(AddressNote *) annotation {
    MKPinAnnotationView *annView=[[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"currentlocation"];
    annView.pinColor = MKPinAnnotationColorGreen;
    annView.animatesDrop=TRUE;
    annView.canShowCallout = YES;
    annView.calloutOffset = CGPointMake(-5, 5);
    return annView;
}

如果我注释掉上面的代码,一切正常。放大/缩小时非常平滑。我是否应该以不同的方式添加注释以提高性能?

我觉得在iPhone屏幕大小的地图部分添加500个地图点毫无意义。您无法将其可视化,甚至无法单击正确的注释

您不能查看地图的缩放级别和中心,然后决定只向地图添加注释子集吗


我想我也见过其他应用程序这样做。

我认为St3fan是正确的。理论上,你可以继续在地图上添加注释,让视图处理它们的显示,但现实情况是,如果你保持一点倒计时效果会更好,一次在屏幕上显示500条就太多了

但是,还有一个步骤需要尝试-确保所有注释视图都将“不透明”设置为“是”,如下所示:

annView.opaque = YES; 

500个注释可能太多了,但如果只查看其中的一些注释,则不会影响性能。但是,您应该对注释使用出列来提高性能

- (MKAnnotationView *)mapView:(MKMapView *)mapView
            viewForAnnotation:(id <MKAnnotation>)annotation
{
    MKPinAnnotationView *view = nil;
    if (annotation != mapView.userLocation) {
        view = (MKPinAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:@"identifier"];
        if (nil == view) {
            view = [[[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"identifier"] autorelease];
        }
        [view setPinColor:MKPinAnnotationColorGreen];
        [view setCanShowCallout:YES];
        [view setAnimatesDrop:NO];
    }
    else {
        // Do something with the user location view
    }
    return view;
}
-(MKAnnotationView*)映射视图:(MKMapView*)映射视图
viewForAnnotation:(id)注释
{
MKPinAnnotationView*视图=nil;
if(注释!=mapView.userLocation){
视图=(MKPinAnnotationView*)[mapView dequeueReusableAnnotationViewWithIdentifier:@“identifier”];
if(nil==视图){
视图=[[MKPinAnnotationView alloc]initWithAnnotation:annotation重用标识符:@“identifier”]autorelease];
}
[查看设置颜色:MKPinAnnotationColorGreen];
[查看设置CanShowCallout:是];
[查看设置动画拖放:否];
}
否则{
//对用户位置视图执行一些操作
}
返回视图;
}

此外,对于500个管脚,放置动画需要很长时间才能完成。你应该用
[view setAnimatesDrop:NO]

关闭它。我为一个客户编写了一个iPhone应用程序,我们为他们的一个商店品牌提供了一个商店定位器。它包括501个位置,当你放大到整个美国时,动画可能会有点不稳定,但如果放大到州一级,它会非常好,在州一级,只有少数几个插针可见

关键是:

  • 在添加批注之前,将用户缩放到其当前位置
  • 使用标识符为“”的出列ReusableAnnotationViews重用注释视图
要实现第一点,需要打开位置更新,并在收到第一个位置更新时设置标志。使用对应用程序有意义的区域范围将地图设置为该位置的动画,然后在
mapView:regionDidChangeAnimated:
中,检查是否仍需要添加批注,以及在调用
addAnnotation:
之前当前位置是否已更新

如果不能或不想放大用户的位置,是否可以过滤最高级别显示的注释,并在用户放大时仅添加其他注释


顺便说一下,我相信您的代码中有内存泄漏,如上所述。即使您不想使用出列机制,您从
mapView:viewForAnnotation:
返回的视图也应该自动删除。

如果您不从视图中删除用户未看到的注释,则可以通过
MKMapViewDelegate
执行此操作。
如果用户缩小到国家/地区级别时性能下降,您可能希望在缩放级别>某些常量值上显示聚合信息,例如,在10平方英里范围内显示单个注释而不是30个注释,如
[30某物]

您误解了问题。查看区域中没有500个针脚。只有几个。如果你缩小的足够远,你最终会看到所有的500个。annView.opaque=是没有帮助。然后您需要控制地图一次知道多少,在放大到一些不可见的位置后,您需要删除它们。这就是为什么我说,从技术上讲,它是如何让你做你正在做的事情的——只是在屏幕外添加许多注释——但就性能而言,现实情况是,你不能在地图上有那么多注释并让它表现良好,所以你必须在一定程度上管理地图真正了解的注释。好的,是的,我同意。但我如何管理它们,以便知道哪些要加载,哪些不加载?我所有的点都在一个数组中。任何与它们相关的东西都表明这些点位于查看区域中,请加载它们的注释。这些不是,请删除它们的注释。您必须设计一些东西来遍历数组并添加地图查看矩形中的元素,删除任何不在其中的元素。。。我认为在调整大小之后,您可能需要清除所有元素,并重新添加那些可见的元素。如果你有很多点,另一个选择是建立一个空间数据库(有一个sqllite的空间版本),但这是一个很大的工作。基本上,这是一个多边形点的问题。当你说“地图查看矩形”时,你是指构成该矩形角的四个lat/long点?我是如何得到这些信息的?你能解释一下你是如何完成这种类型的延迟加载的吗?每当地图滚动时,MKMapView都会将消息传递给它的代理。每次发生这种情况时,存储视图的纬度和经度增量,以便了解地图的销售情况。存储值之前,请检查地图比例是否已增大或缩小到需要调整注释数量的程度。如果是这样,只需进行详细程度的计算。穿行李