TWebbrowser在加载本地Google地图HTML实时标记时非常缓慢

5
我正在每2秒钟显示20个实时GPS点(使用谷歌地图来显示和处理点)并在我的TWebBrowser中从index.html中显示它,这导致我的应用程序速度变慢。
由于我在同一应用程序下有另一个模块允许我将数据输入到我的数据库中,因此通常会使我的应用程序冻结。
我知道线程可以解决这个问题,但我不确定它是否能解决我的问题。有什么想法吗?
谢谢 Gwenael
附注:我从外部文件加载我的JavaScript代码(而不是从我的Delphi应用程序加载源代码),这会减慢我的应用程序吗?

你能否包含你正在使用的源代码来显示GPS点吗? - RRUZ
2个回答

3
如果你从外部文件获取JavaScript,它将被缓存,所以不会拖慢你的速度太多,除了第一次可能会慢一点。
导致缓慢的可能原因和加快速度的建议:
  • TWebBrowser包装Internet Explorer,在处理此类任务时速度不是特别快;如果你想要快速处理JavaScript,请考虑使用DelphiChromiumEmbedded

  • 如果你每两秒钟绘制一个标记,那么对于一小时的驾驶路程,你将不得不绘制1800个标记。如果您想显示多个行程,绘制所有带阿尔法透明度的图标将是一个繁重的任务。

我通常每2分钟或者上次标记后行驶200米以上才会绘制一个标记(带有行驶方向的箭头)。这样当汽车静止不动时,就不必绘制整个标记云了。

您可以使用道格拉斯-普克算法简化线条。作为参数,您将给出在该行中允许的最大误差,并且它将尽可能多地删除点,而不超过该误差。因此,当您拥有一条直线时,它将删除边缘之间的所有点。
另外,您可以考虑在某些缩放级别下对点进行聚类。如果您使用OpenLayers,则会更容易,但是借助Google Maps Util Library的帮助,您可以使用Google Maps(示例)来实现相同的效果。如果您缩小视图,则在10x10像素的区域上绘制2000个重叠图标有点无用。
如果您向我展示您的代码,我可以给您提供一些有关如何加速的直接建议。

谢谢Wouter。我实际上正在测试TChromium,它似乎比TWebBrowser更快(顺便问一下,TChromiumOSR是什么?)。 - Gwenael
OSR指的是OffScreen Renderer,它是一个非可视化组件,可以让您自己渲染浏览器。有一个示例可以将浏览器渲染到Graphics32 Paintbox中。 - Henri Gourvest

1

这是我的 Delphi 代码:

  i := 0;
  With DMMain.MDMain do
  begin
    QLastPositionGPS.Close ;
    QLastPositionGPS.Open ;
    QLastPositionGPS.First ;
    for i:=0 to QLastPositionGPS.RecordCount-1 do
    begin
      GPSLatitude     := StringReplace(QLastPositionGPS.FieldByName('latitude').AsString, ',', '.', [rfreplaceall]) ;
      GPSLongitude    := StringReplace(QLastPositionGPS.FieldByName('longitude').AsString, ',', '.', [rfreplaceall]) ;
      HeureDernierGPS := QLastPositionGPS.FieldByName('maj').AsString ;

      MDMain.QGPSactifs.Close ;
      MDMain.QGPSactifs.ParamByName('id_artisan').AsInteger := MDMain.QLastPositionGPS.FieldByName('id_artisan').AsInteger ;
      MDMain.QGPSactifs.Open ;
      if MDMain.QGPSactifs.FieldByName('etat').AsBoolean = True then
      begin         CdrCarto.Chromium1.Browser.MainFrame.ExecuteJavaScript('AjouterMarqueurCirculant('+ GPSLatitude + ', ' + GPSLongitude + ', ' + MDMain.QLastPositionGPS.FieldByName('id_artisan').AsString + ')', 'about:blank', 0) ;
      end else if OptionDisplayGPSActif then
        if (MDMain.QGPSactifs.FieldByName('etat').AsBoolean = False) and (MDMain.QGPSactifs.FieldByName('etat_serveur').AsBoolean = True) then
        begin
         CdrCarto.Chromium1.Browser.MainFrame.ExecuteJavaScript('AjouterMarqueurGPS('+ GPSLatitude + ', ' + GPSLongitude + ', ' + MDMain.QLastPositionGPS.FieldByName('id_artisan').AsString + ')', 'about:blank', 0);

        end;
      QLastPositionGPS.Next ;
      MDMain.QGPSactifs.Close ;
    end;
    QLastPositionGPS.Close ;
  end;
end;

我的JavaScript代码:

 function AjouterMarqueurCirculant(Lat, Long, notaxi) {
    var marker = new MarkerWithLabel({
      position: new google.maps.LatLng(Lat, Long),
       draggable: true,
       map: map,
       labelContent: "Taxi "+notaxi,
       labelAnchor: new google.maps.Point(22, 0),
       labelClass: "labelsactif",                      // the CSS class for the label
       labelStyle: {opacity: 0.75},
       labelVisible: true,
      icon:"icones/taxi_circulant_ok.png"
     });

     var iw = new google.maps.InfoWindow({
       content: "Nom Prenom"
     });
     google.maps.event.addListener(marker, "click", function (e) { iw.open(map, marker); });

    markersCirculant.push(marker);
    bounds.extend(new google.maps.LatLng(Lat, Long));
  }

不要混合使用语言,这是不专业的行为,也不易于其他人维护,特别是对于id、css选择器、函数名称、文件名和其他id等。 - Codebeat

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接