Как отобразить большое количество GMSPolylines без максимальной загрузки процессора? - PullRequest
1 голос
/ 07 апреля 2019

Я создаю приложение, которое отображает автобусные маршруты, используя API NextBus и Google Maps.Однако у меня возникла проблема с использованием процессора, которая, по-моему, вызвана количеством GMSPolylines на карте.Маршрут отображается массивом полилиний, состоящим из точек, заданных NextBus для данного маршрута.Когда полилинии добавляются на карту, а GMSCamera просматривает весь маршрут, процессор на симуляторе (iPhone X) максимально достигает 100%.Однако при увеличении определенного участка маршрута загрузка ЦП снижается до ~ 2%.

Снимок экрана карты: https://i.imgur.com/jLmN26e.png Производительность: https://i.imgur.com/nUbIv5w.png

NextBus API возвращает информацию о маршруте, включая маршрут по конкретному маршруту шины.Вот небольшой пример данных, с которыми я работаю:

Route: {
    "path": [Path]
}

Path: {
    "points:" [Coordinate]
}

Coordinate: {
    "lat": Float,
    "lon": Float
}

А вот мой метод, который создает полилинии из данных.В целом для маршрута в среднем существует ~ 700 координат, распределенных по ~ 28 полилиниям (каждый объект пути).Помните, что я не отображаю несколько маршрутов на одной странице, я отображаю только один маршрут за раз.

func buildRoute(routePath: [Path?]) -> [GMSPolyline] {
    var polylines: [GMSPolyline] = []

    for path in routePath {
         let path = GMSMutablePath()
         guard let coords = path?.points else {continue}

         for coordinate in coords {
            // Safely unwrap latitude strings and convert them to doubles.
            guard let latStr = coordinate?.lat,
                  let lonStr = coordinate?.lon else {
                      continue
            }

            guard let latOne = Double(latStr),
                  let lonOne = Double(lonStr) else {
                      continue
            }

            // Create location coordinates.
            let pointCoordinatie = CLLocationCoordinate2D(latitude: latOne, longitude: lonOne)
            path.add(pointCoordinatie)
        }

        let line = GMSPolyline(path: path)
        line.strokeWidth = 6
        line.strokeColor = UIColor(red: 0/255, green: 104/255, blue: 139/255, alpha: 1.0)
        polylines.append(line)
    }

    return polylines
}

Наконец, вот мой метод, который добавляет полилинии на карту:

fileprivate func buildRoute(routeConfig: RouteConfig?) {
    if let points = routeConfig?.route?.path {
        let polylines = RouteBuiler.shared.buildRoute(routePath: points)

        DispatchQueue.main.async {
            // Remove polylines from map if there are any.
            for line in self.currentRoute {
                line.map = nil
            }

            // Set new current route and add it to the map.
            self.currentRoute = polylines
            for line in self.currentRoute {
                line.map = self.mapView
            }
        }
    }
}

Есть ли проблема с тем, как я строю полилинии?Или просто слишком много координат?

...