Swift 如何显示大量的GMSPolylines而不消耗最大的CPU使用量?

Swift 如何显示大量的GMSPolylines而不消耗最大的CPU使用量?,swift,google-maps-sdk-ios,Swift,Google Maps Sdk Ios,我正在制作一个应用程序,使用NextBusAPI和谷歌地图显示公交线路。然而,我在CPU使用方面遇到了一个问题,我认为这是由地图上的GMSPolyline数量引起的。管线由多段线阵列显示,多段线由NextBus为给定管线指定的点组成。当多段线被添加到地图中,并且GMSCamera正在俯视整个路线时,模拟器(iPhone X)上的CPU最大值为100%。然而,当放大路由的某一特定部分时,CPU使用率会下降到~2% 地图截图: 性能: NextBus API返回路由信息,包括特定总线路径的路由。下面

我正在制作一个应用程序,使用NextBusAPI和谷歌地图显示公交线路。然而,我在CPU使用方面遇到了一个问题,我认为这是由地图上的GMSPolyline数量引起的。管线由多段线阵列显示,多段线由NextBus为给定管线指定的点组成。当多段线被添加到地图中,并且GMSCamera正在俯视整个路线时,模拟器(iPhone X)上的CPU最大值为100%。然而,当放大路由的某一特定部分时,CPU使用率会下降到~2%

地图截图: 性能:

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
            }
        }
    }
}

我如何构造多段线有问题吗?还是坐标太多?

我遇到了这个问题。这是一个相当奇怪的错误——当您超过某个多段线阈值时,CPU突然固定到100%

我发现GMSPolygon没有这个问题。所以我把所有的GMSPolyline都换成了GMSPolygon

为了获得正确的笔划宽度,我使用以下代码创建一个多边形,该多边形以给定笔划宽度跟踪多段线的轮廓。我的计算需要LASwift线性代数库

导入核心位置
进口拉斯维夫特
导入谷歌地图
结构段{
let from:CLLOCATIONCoordinated2D
let to:CLLocationCoordinated2D
}
枚举右左{
箱子右,左
}
//将给定路径向左或向右偏移给定距离
func offsetPath(rightleeft:rightleeft,路径:[CLLocationCoordinate2D],偏移量:Double)->[CLLocationCoordinate2D]{
var抵销点=[CLLocationCoordinate2D]()
分段:分段!
对于0..CLLocationCoordinate2D中的i{
返回getLineIntersection(p0:line0.from,p1:line0.to,p2:line1.from,p3:line1.to,段:段)
}
// https://stackoverflow.com/questions/563198/how-do-you-detect-where-two-line-segments-intersect
//如果线段相交,则返回交点,否则为零
func getLineIntersection(p0:CLLocationCoordinate2D,p1:CLLocationCoordinate2D,p2:CLLocationCoordinate2D,p3:CLLocationCoordinate2D,段:布尔)->CLLocationCoordinate2D{
设s1x=p1.经度-p0.经度
设s1y=p1.纬度-p0.纬度
设s2x=p3.经度-p2.经度
设s2y=p3.纬度-p2.纬度
让分子=(s2x*(p0.latitude-p2.latitude)-s2y*(p0.longitude-p2.longitude))
设分母=(s1x*s2y-s2x*s1y)
如果分母==0.0{
归零
}
设t=分子/分母
中频段{
设s=(s1y*(p0.经度-p2.经度)+s1x*(p0.纬度-p2.纬度))/(s1x*s2y-s2x*s1y)

警卫(s>=0&&s=0&&t什么是
RouteConfig
RouteBuilder
以及它们来自何处?
RouteConfig
只是从NextBus API获取的对象;它包含关于路由的所有信息,包括路径。
RouteBuilder
是包含
buildRoute
的类从
routeConfig.route.path
对象生成多段线的hod。它位于单独的类中,因为我需要在应用程序的其他部分重用代码。