Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/476.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在滚动上更新Mapbox性能_Javascript_Performance_Google Chrome Devtools_Mapbox_Mapbox Gl Js - Fatal编程技术网

Javascript 在滚动上更新Mapbox性能

Javascript 在滚动上更新Mapbox性能,javascript,performance,google-chrome-devtools,mapbox,mapbox-gl-js,Javascript,Performance,Google Chrome Devtools,Mapbox,Mapbox Gl Js,我正在开发一个应用程序,它使用Mapbox显示路线,并允许用户通过上下滚动页面来导航路线 我正在使用一些类似于中所示的技术。比如直接用新坐标更新源,并在每次迭代中移动地图(我使用flyTo而不是panTo,因为我也会更新缩放/方位) 当使用ChromeDevTools的性能选项卡分析Mapbox的示例时,它们的帧速率看起来很棒。但是,在我的应用程序中执行相同操作时,一致性要差得多,有些帧需要50到100毫秒 正如您在屏幕截图中所看到的,有一些requestAnimationFrame调用不是由

我正在开发一个应用程序,它使用Mapbox显示路线,并允许用户通过上下滚动页面来导航路线

我正在使用一些类似于中所示的技术。比如直接用新坐标更新源,并在每次迭代中移动地图(我使用
flyTo
而不是
panTo
,因为我也会更新缩放/方位)

当使用ChromeDevTools的性能选项卡分析Mapbox的示例时,它们的帧速率看起来很棒。但是,在我的应用程序中执行相同操作时,一致性要差得多,有些帧需要50到100毫秒

正如您在屏幕截图中所看到的,有一些
requestAnimationFrame
调用不是由我的代码触发的,需要花费大量时间来执行

我在动画或Js性能改进方面的经验有限。我已经四处寻找了一段时间,尝试了很多不同的选择

该代码与以下代码非常相似:

const app = new App();

$(window).on('scroll', function(){
  app.onScroll();
});


class App {

  [...]

  onScroll() {
    this.latestScroll = window.pageYOffset;

    if(!this.ticking) {
      requestAnimationFrame(this.updateScroll.bind(this));
      this.ticking = true;
    }
  }

  updateScroll() {
    this.ticking = false;

    [...]

    if (this.shouldUpdate()) {
      this.drawPath(path);
      this.moveCamera(position, bearing, zoom);
    }
  }

  drawPath(path) {
    const geojson = {
      type: 'Feature',
      properties: {},
      geometry: {
        type: 'LineString',
        coordinates: path
      }
    };

    this.map.getSource('route').setData(geojson);
  }

  moveCamera(position, bearing, zoom) {
    this.map.flyTo({
      center: position,
      bearing,
      zoom,
      animate: false,
    });
  }
}