Google maps api 3 谷歌地图api v3无平滑拖动

Google maps api 3 谷歌地图api v3无平滑拖动,google-maps-api-3,lag,Google Maps Api 3,Lag,我开始使用MapsAPI v3实现我的软件。不幸的是,我发现V3API有一些严重的问题,这让我不再使用商业许可证 我的客户使用高清分辨率为1920x1080的显示器,地图占据了90%的屏幕空间。不幸的是,我所说的问题来了。当我在地图上用鼠标点击并开始拖动它时,它是非常不,真的很烦人。所有的乐趣都消失了 我使用windows XP、windows 7和windows 8尝试了一些不同的场景。我使用的浏览器是最新版本的Firefox、Chrome和IE。 以下是我尝试拖动地图时的结果: 小屏幕分辨率

我开始使用MapsAPI v3实现我的软件。不幸的是,我发现V3API有一些严重的问题,这让我不再使用商业许可证

我的客户使用高清分辨率为1920x1080的显示器,地图占据了90%的屏幕空间。不幸的是,我所说的问题来了。当我在地图上用鼠标点击并开始拖动它时,它是非常不,真的很烦人。所有的乐趣都消失了

我使用windows XP、windows 7和windows 8尝试了一些不同的场景。我使用的浏览器是最新版本的Firefox、Chrome和IE。 以下是我尝试拖动地图时的结果:

  • 小屏幕分辨率320x240:Firefox、Chrome和IE处理得非常好。不可能注意到拖动不平稳
  • 小屏幕分辨率320x240,地图上有10条多段线:Chrome和IE处理得不错,但如果你有v2 API的经验,你会注意到一个不同点。Firefox-噩梦,拖动一点也不顺畅
  • 中等屏幕分辨率1024x768。Firefox-存在一些不一致的滞后。Chrome和IE-有点平滑拖动,但如果你快速移动鼠标,事情会变得更糟
  • 中等屏幕分辨率1024x768,地图上有10条多段线。火狐-噩梦。Chrome和IE-你开始注意到有一些延迟,但同时它看起来有点平滑
  • 高屏幕分辨率1920x1080。火狐-巨大的滞后。Chrome和IE-稍微好一点,但仍然存在明显的滞后。 6) 高屏幕分辨率1920x1080,地图上有多段线:Firefox、Chrome广告IE-噩梦。拖动地图几乎是不可能的
  • 有趣的事实:

  • 谷歌地图的v2 API不存在上述问题
  • 当鼠标移动速度低于每秒50-60像素时,上述问题不存在。拖动非常平稳。当鼠标快速移动时,会出现滞后现象
  • 关于这个问题根本不存在,但当我打开《开发者指南》中的一些代码示例时,问题就出现了。下面是一个例子:
  • 我认为我尽可能深入地描述了这个问题,无论我多么努力地绕过它,我都找不到任何解决办法

    如果有人就这个问题发表意见,我会很高兴的

    不幸的是,我没有v2的密钥,因此我无法创建一个示例,让您可以在本地主机之外查看地图,但我发现了一个网站,其中有一个并排比较(v2和v3)。尝试拖动地图以查看差异

    地图的分辨率非常小,很可能没有经验的用户可能看不到差异,因此我将为您提供地图的单独链接,您只需使用firebug或类似的调试程序,使画布分辨率更大。然后你就会明白我在说什么了

    • 地图v2:
    • 地图v3:

      • 这里也一样。我注意到v3在平移地图时会触发很多事件,浏览器往往会阻塞(尤其是FF)。我这么说是因为我也使用了Bing Maps API,而
        viewchange
        (相当于谷歌
        center\u change
        )每秒的事件数要小得多。它们还提供了方法
        addThrottledHandler()
        ,您可以使用该方法减少生成的事件数

        据我所知,谷歌地图似乎在地图视图更新之前为每个
        mousemove
        事件触发一个
        center\u changed
        事件。因此,生成了很多事件,但没有一个事件在屏幕上复制;浏览器因地图视图更新而阻塞,或者地图可能会等待,直到不再有更改,然后才更新视图

        编辑:如果我们阻止一些
        mousemove
        事件到达谷歌地图,那么浏览器将不会被
        mousemove
        事件以及谷歌地图由此事件生成的所有其他事件阻塞,如
        center\u changed
        ,地图将平稳平移。

        为此,我们将事件侦听器添加到
        #map
        div(我们也可以将其添加到
        body
        标记)。我们为捕获阶段添加事件。当鼠标在屏幕上移动时,首先是
        主体
        标记接收事件,然后是我们的
        #map
        div,然后是谷歌地图元素(div、tiles)。这是捕获阶段。之后是冒泡阶段,在冒泡阶段中,事件从Google Maps元素返回到我们的
        #map
        div,然后返回到
        body
        标记。通常,事件处理程序是为冒泡阶段注册的,因此如果我们为捕获阶段注册一个处理程序,我们可以取消该事件,因此该事件将没有冒泡阶段。这也意味着谷歌地图将不会收到该活动

        您可以增加
        period
        space
        参数以终止更多事件。杀死太多事件意味着地图将开始从一个位置跳到下一个位置。杀得太少意味着所有事件都将到达谷歌地图,浏览器将被谷歌地图新生成的事件阻塞,因此地图将从一个位置跳到下一个位置。一些中间立场最有效

        现在,在所有这些之后,谷歌地图将不会像Bing地图那样流畅。这是因为Bing地图使用惯性:当你剧烈移动地图时,地图会慢慢开始跟随鼠标,然后越来越快。这确实创造了一个非常平滑的平底锅

        我发现一个有趣的事实是,即使鼠标不动,谷歌Chrome和Opera/Chromium每秒也会生成一个
        mousemove
        事件!此代码也将终止这些事件(因为这些事件的距离为零)

        (检查Firefox中的js控制台;您应该会看到一些事件。)
        <html>
          <head>
            <style type='text/css'>
              #map {
                  position: absolute;
                  width: 100%;
                  height: 100%;
                  margin: 20px;
              }
            </style>
        
            <script type='text/javascript'>
              var last = {time : new Date(),    // last time we let an event pass.
                          x    : -100,          // last x position af the event that passed.
                          y    : -100};         // last y position af the event that passed.
              var period = 100; // ms - don't let pass more than one event every 100ms.
              var space  = 2;   // px - let event pass if distance between the last and
                                //      current position is greater than 2 px.
        
              function init_map() {
                  map_div = document.getElementById("map")
                  // map
                  var map_options = {
                      center: new google.maps.LatLng(45.836454, 23.372497),
                      zoom: 8
                  };
                  map = new google.maps.Map(document.getElementById("map"), map_options);
        
                  // register event handler that will throttle the events.
                  // "true" means we capture the event and so we get the event
                  // before Google Maps gets it. So if we cancel the event,
                  // Google Maps will never receive it.
                  map_div.addEventListener("mousemove", throttle_events, true);
              };
        
              function throttle_events(event) {
                  var now = new Date();
                  var distance = Math.sqrt(Math.pow(event.clientX - last.x, 2) + Math.pow(event.clientY - last.y, 2));
                  var time = now.getTime() - last.time.getTime();
                  if (distance * time < space * period) {    //event arrived too soon or mouse moved too little or both
                      console.log("event stopped");
                      if (event.stopPropagation) { // W3C/addEventListener()
                          event.stopPropagation();
                      } else { // Older IE.
                          event.cancelBubble = true;
                      };
                  } else {
                      console.log("event allowed: " + now.getTime());
                      last.time = now;
                      last.x    = event.clientX;
                      last.y    = event.clientY;
                  };
              };
            </script>
        </head>
        <body onload = "init_map()">
            <div id="map"></div>
        </body>
        </html>