美文网首页
iOS 百度地图AnnotationView优化

iOS 百度地图AnnotationView优化

作者: 赵哥窟 | 来源:发表于2018-12-14 10:03 被阅读35次
    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上运行也不崩溃了。

    相关文章

      网友评论

          本文标题:iOS 百度地图AnnotationView优化

          本文链接:https://www.haomeiwen.com/subject/qejwhqtx.html