我遇到了谷歌地图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秒放大和缩小会话期间拍摄的两个屏幕截图。
请注意,原始谷歌地图网站似乎根本没有使用GPU内存,而我的网站则大量使用它。实际上在拍摄屏幕截图时它的速度为146 MB,然而,速度在0-200MB之间波动很大。
我接下来要做的是在Chrome中启用开发控制台的 Paint Flashing 功能,该功能会显示重绘的矩形。我再次放大并缩小地图并制作截图:
这里很明显,我的网站只是试图重新绘制正在改变的内容,而原始谷歌地图网站总是重新绘制整个图片。无论我持续缩放多长时间,原始网站总是重新绘制整个内容,并且根本不会使用GPU内存。
有没有人经历过类似的行为,是否有任何方式(可能是一些设置)让我也像谷歌在他们的网站上做的那样渲染地图?我的具体使用案例确实无法使用谷歌地图和我正在经历的表现。
答案 0 :(得分:6)
原因是谷歌地图api与谷歌地图应用程序使用的javascript不一样。
如果您查看生成的地图,您可以看到使用api创建的地图是由多个div创建的,每个div是一个地图图块图像。 在缩放期间,必须使用新图像重新渲染每个图块。 同样在网络选项卡中,您可以看到您正在将地图图块下载为图像。
另一方面,谷歌地图应用程序有一个画布元素,在缩放过程中你不是下载图像而是矢量数据(以某种谷歌格式),它们被渲染到画布中。 Canvas对象本身受支持,并且比使用DOM元素替换图像便宜。