0

我当前用于向 MapView 添加叠加层的代码在缩放时非常慢。瓷砖最初渲染大约需要 2 或 3 秒。我想知道在用户开始放大地图之前,是否有一种方法可以调用我用来在打开应用程序时为每个缩放级别缓存所有图块的 API。或者,如果有任何其他提高效率的建议,我很乐意听到。谢谢!

这是我的代码,每 0.5 秒更改一次显示的叠加层

    @objc func changeOverlay() {
        if(currentOverlay == 9) {
            currentOverlay = 0
        }
        let allOverlays = mapView.overlays
        mapView.removeOverlays(allOverlays)
        overlayTimeLabel.text = overlayTimeArray[currentOverlay]
        if(overlays.count == 9) {
            mapView.addOverlay(europeOverlays[currentOverlay], level: .aboveRoads)
            mapView.addOverlay(northAmericaOverlays[currentOverlay], level: .aboveRoads)
            currentOverlay += 1
        }
    }

这是我的渲染器代码

    func mapView(_ mapView: MKMapView, rendererFor overlay: MKOverlay) -> MKOverlayRenderer {
        let renderer = MKTileOverlayRenderer(overlay:overlay)
        renderer.alpha = 0.8

        return renderer
    }
4

1 回答 1

0

我见过类似的效果。

Apple 的默认平铺大小为 256;服务器通常喜欢提供和缓存 512 大小的切片,因为流行的 Web 库就是这样做的。我的理论是服务器不会即时缓存和/或渲染较小的图块大小,因为它们通常不被使用。无论我的理论是否正确,512 在我的测试中都更快。

我就是这样做的:

class MyTileOverlay: MKTileOverlay {
    
    override func url(forTilePath path: MKTileOverlayPath) -> URL {
        self.tileSize = CGSize(width: 512, height: 512)
        
        // ...
    }
}

可能有更好的地方来设置图块大小,但这很有效。您可能必须告诉服务器您想要大小为 512 的图块,具体取决于您的服务器想要什么。

于 2021-09-10T07:48:57.003 回答