Google Maps v3性能问题

时间:2016-03-17 09:29:16

标签: javascript google-maps google-maps-api-3

我遇到了谷歌地图v3 api的大量性能问题,在搜索此问题时找不到任何有类似问题的人。这个问题可以在任何浏览器上看到,但我在这里专注于Chrome。

症状:

当我放大地图或离开地图时,FPS率大幅下降,导致难以接受的糟糕体验。

我的代码:

我使用他们的文档使用最简单的示例实现了谷歌地图。

<!DOCTYPE html>
<html>
  <head>
    <title>Simple Map</title>
    <meta name="viewport" content="initial-scale=1.0">
    <meta charset="utf-8">
    <style>
      html, body {
        height: 100%;
        margin: 0;
        padding: 0;
      }
      #map {
        height: 100%;
      }
    </style>
  </head>
  <body>
    <div id="map"></div>
    <script>
      var map;
      function initMap() {
        map = new google.maps.Map(document.getElementById('map'), {
          center: {lat: -34.397, lng: 150.644},
          zoom: 8
        });
      }
    </script>
    <script src="https://maps.googleapis.com/maps/api/js?callback=initMap"
    async defer></script>
  </body>
</html>

到目前为止我测试的内容:

首先,转到https://maps.google.com并尝试缩放功能(使用鼠标滚轮)会产生非常好的效果。一切顺利,FPS率为60 fps。 在我的测试中,我打开了官方谷歌地图网站和我的小示例页面,并执行了以下操作:

在Chrome开发控制台中,我启用了“显示FPS计”。以下是原始网站和我的网站在20秒放大和缩小会话期间拍摄的两个屏幕截图。

FPS on my website FPS on original website

请注意,原始谷歌地图网站似乎根本没有使用GPU内存,而我的网站则大量使用它。实际上在拍摄屏幕截图时它的速度为146 MB,然而,速度在0-200MB之间波动很大。

我接下来要做的是在Chrome中启用开发控制台的 Paint Flashing 功能,该功能会显示重绘的矩形。我再次放大并缩小地图并制作截图: Paint Flashing on my website Paint Flashing on original website

这里很明显,我的网站只是试图重新绘制正在改变的内容,而原始谷歌地图网站总是重新绘制整个图片。无论我持续缩放多长时间,原始网站总是重新绘制整个内容,并且根本不会使用GPU内存。

现在我的问题:

有没有人经历过类似的行为,是否有任何方式(可能是一些设置)让我也像谷歌在他们的网站上做的那样渲染地图?我的具体使用案例确实无法使用谷歌地图和我正在经历的表现。

1 个答案:

答案 0 :(得分:6)

原因是谷歌地图api与谷歌地图应用程序使用的javascript不一样。

如果您查看生成的地图,您可以看到使用api创建的地图是由多个div创建的,每个div是一个地图图块图像。 在缩放期间,必须使用新图像重新渲染每个图块。 同样在网络选项卡中,您可以看到您正在将地图图块下载为图像。

另一方面,谷歌地图应用程序有一个画布元素,在缩放过程中你不是下载图像而是矢量数据(以某种谷歌格式),它们被渲染到画布中。 Canvas对象本身受支持,并且比使用DOM元素替换图像便宜。