您的当前位置:首页iOS 百度地图AnnotationView优化

iOS 百度地图AnnotationView优化

2024-12-14 来源:哗拓教育
WechatIMG31.jpeg

如图产品需求:在百度地图上展示标注和轨迹。
优化之前只能在百度地图上展示200个AnnotationView和500多个轨迹。超过200个拖动就会有卡顿。

但是产品希望把200个AnnotationView提高到1000个左右,轨迹不限制。。
吐槽就不吐槽了。接下来说说优化思路。

思路一:从接口开始
目前轨迹接口返回2000多个位置信息,如果这2000多个数据一起返回。解析jason就有点耗时。所有想到的是2000多个信息分多个数组返回。但还是一个接口返回,比如2000个数据分别放到20个数组,一个数组100个位置信息, 这样就解析就可以用异步多线程解析,提高了解析速度。降低了瞬间内存提升。
标注点接口一样的思路。

思路二:看卡顿是那个部分造成的。
实验1:只绘制2000多个轨迹线很快,拖动也没有卡顿的情况很流畅。
实验2:只绘制800多个标注点,绘制就卡。比如iPhone5s直接就崩溃了。

问题出在绘制AnnotationView。知道问题了哪怎么解决?
首先看一下AnnotationView是一个自定义的,继承BMKPinAnnotationView
图片是用的切图,文本是UILabel。试想一下瞬间读取加载800张图片能不卡吗。
所以解决办法是 图片和文本都采用绘制。

主要代码

-(void)drawRect:(CGRect)rect fillColor:(UIColor *)fillColor fontSize:(CGFloat)fontSize lineWidth:(CGFloat)lineWidth{
    _solidLine =  [CAShapeLayer layer];
    CGMutablePathRef solidPath =  CGPathCreateMutable();
    _solidLine.lineWidth = lineWidth ;
    _solidLine.strokeColor = [UIColor whiteColor].CGColor;
    _solidLine.fillColor = fillColor.CGColor;
    CGPathAddEllipseInRect(solidPath, nil, rect);
    _solidLine.path = solidPath;
    CGPathRelease(solidPath);
    [self.layer addSublayer:_solidLine];
    
    // 绘制文本的图层
    _layerText = [[CATextLayer alloc] init];
    // 背景颜色
    _layerText.backgroundColor = [UIColor clearColor].CGColor;
    // 渲染分辨率-重要,否则显示模糊
    _layerText.contentsScale = [UIScreen mainScreen].scale;
    // 显示位置
    _layerText.bounds = CGRectMake(0.0,0, rect.size.width, rect.size.width/2.0);
    _layerText.position = CGPointMake(rect.size.width/2, rect.size.height/2.0);
    _layerText.alignmentMode = kCAAlignmentCenter;
    _layerText.string = [NSString get6parameters:_monitorModel.val];
    if ([self.monitorModel.val floatValue] <= 0) {
        _layerText.foregroundColor = [UIColor getColorWithHexString:@"808080"].CGColor;
    }
    else{
        _layerText.foregroundColor = [UIColor whiteColor].CGColor;
    }
    _layerText.fontSize = fontSize;
    // 添加到父图书
    [self.layer addSublayer:_layerText];
}

在运行一下 iPhone5s 也不崩溃了。但是拖动也卡顿。包括iPhonex上拖动也有明显卡顿,怎么回事。具体不知百度地图内部怎么实现的。猜想应该是拖动的时候又重新绘制了一次地图和标注点吧。
所以在拖动的时候Remove一次AnnotationView

[self.mapView removeAnnotations:self.mapView.annotations];

验证了一下。OK了。在iPhone5s 拖动也不卡了。目前能绘制800多个AnnotationView和2000多个轨迹线。在iPhone5s上运行也不崩溃了。

显示全文