Я создаю приложение, которое отображает автобусные маршруты, используя 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
}
}
}
}
Есть ли проблема с тем, как я строю полилинии?Или просто слишком много координат?