如图产品需求:在百度地图上展示标注和轨迹。
优化之前只能在百度地图上展示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上运行也不崩溃了。