MapKit использует слишком много процессора в IOS 13 - PullRequest
2 голосов
/ 18 октября 2019

В последнее время мое приложение для iOS начало часто падать после того, как некоторые пользователи обновились до iOS 13.x (проблема не возникает в iOS 12.x)

Я использую Mapkit для рендеринга некоторых MKPolygons и MKPolylines.

MKPolylines удаляются и повторно добавляются в MKMapView примерно 10 раз в секунду (потому что мой GPS дает мне новые значения широты / долготы при 10 Гц).

Я профилировал свое приложение в iOS12.x и использует от 15% до 30% ресурсов процессора (iPad Mini 4).

Я сделал то же самое профилирование в iOS 13.1.2 и 13.1.3, и потребление процессора возросло дооколо 150% (имеется 2 ядра ЦП).

Если я удаляю код, который отображает 2 MKPolylines на 10 Гц, загрузка ЦП возвращается к уровням iOS 12.x.

ВiOS 13.x мое приложение убивается iOS, и в журналах сбоев оно сообщает причину примерно так: процессор превышает X% в течение Y секунд.

Вот код, который добавляет и удаляетдве MKPolyLines:

 func updateLinesToField(myLocation: CLLocationCoordinate2D, field : Site) {
        guard let field = State.shared.currentField else {
            return
        }

        if let _ = closestPassPoint {
            if passLine != nil {
                //calls MKMapView's removeOverlay method
                mapView.remove(passLine)
            }
            if field.state != .completed && myLocation.distanceTo(closestPassPoint) <= Settings.shared.passExtensionLengthMeters {
                passLine = StyledPolyLine(coordinates: [myLocation, closestPassPoint], count: 2)
                passLine.styleAsLineToPass()
                //calls MKMapView's addOverlay method
                mapView.add(passLine)
            }
        }

        if routeLine != nil {
            //calls MKMapView's removeOverlay method
            mapView.remove(routeLine)
        }

        if Settings.shared.showLineToField == .show && field.state != .completed {

            guard State.shared.currentField.passes != nil else {
                return
            }

            let currentPassIndex = State.shared.clipPassIndex()
            let currentPass = State.shared.currentField.passes[currentPassIndex]

            if let nearestPassCoords = currentPass.approachPoints {
                let dist0 = State.shared.currentLocation.distanceTo(nearestPassCoords[0])
                let dist1 = State.shared.currentLocation.distanceTo(nearestPassCoords[1])
                if dist0 < dist1 {
                    routeLine = StyledPolyLine(coordinates: [myLocation, nearestPassCoords[0]], count: 2)
                } else {
                    routeLine = StyledPolyLine(coordinates: [myLocation, nearestPassCoords[1]], count: 2)
                }
                routeLine.styleAsLineToField()
                //calls MKMapView's addOverlay method
                mapView.add(routeLine)
            }
        }
    }

и StyledPolyLine просто наследует от MKPolyline:

class StyledPolyLine: MKPolyline {
    var strokeColor: UIColor!
    var lineWidth: CGFloat! // defaults to 0, which is MKRoadWidthAtZoomScale(currentZoomScale)
    var lineDashPattern: [NSNumber]! // defaults to nil


    func renderer() -> MKPolylineRenderer {
        let _renderer = MKPolylineRenderer(overlay: self)
        _renderer.strokeColor = self.strokeColor
        _renderer.lineWidth = self.lineWidth
        _renderer.lineDashPattern = self.lineDashPattern
        /*
        if #available(iOS 13.0, *) {
            _renderer.shouldRasterize = true
        }
         */
        return _renderer
    }
}

Обратите внимание, что я попытался изменить параметр shouldRasterize на true, и это не повлияло на загрузку ЦП.

Есть идеи, как вернуть использование ЦП обратнодо уровня iOS 12.x?

...