5

TWebBrowser で index.html (Google マップを使用してポイントを表示および処理) から表示することにより、2 秒ごとに多くのリアルタイム GPS ポイント (20) を実際に表示していますが、アプリの速度が大幅に低下します。

そして、同じアプリケーションの下に別のモジュールを取得して、データベースにデータを入力できるようにすると、通常はアプリがフリーズします。

スレッドがそのために作られていることは知っていますが、それが私の問題を解決するかどうかはわかりません。何か案は ???

ありがとうグエナエル

PS : 外部ファイルから JavaScript コードをロードしているという事実 (および、デルファイ アプリケーションのソース コード ロードデッドではない) は、アプリを遅くする可能性がありますか?

4

2 に答える 2

3

外部ファイルからjavascriptを取得すると、キャッシュされるので、いいえ、おそらく初めての場合を除いて、それほど遅くなることはありません。

速度低下の考えられる原因、および物事をスピードアップするための提案:

  • TWebBrowserはInternetExplorerをラップしますが、このタイプのタスクに関しては、その生の速度で正確に有名ではありません。高速なJavaScript処理が必要な場合は、 DelphiChromiumEmbeddedを検討してください

  • 2秒ごとにマーカーを描画する場合、1時間のドライブで1800個のマーカーを描画する必要があります。複数の旅行を表示したい場合は、すべてのアイコンをアルファ透明度で描画するのは大変な作業になります。

私は通常、 2分ごとに、または最後のマーカーから200m以上移動した場合は、マーカー(運転方向の矢印)を描画します。そうすれば、車が静止しているときにマーカーの雲全体を描く必要がありません。

douglas-peuckerアルゴリズムを使用して、行を単純化できます。パラメータとして、行で許可する最大のエラーを指定し、そのエラーを超えずに可能な限り多くのポイントを削除します。したがって、直線がある場合は、エッジ間のすべてのポイントが削除されます。

また、特定のズームレベルでのクラスタリングポイントを検討することもできます。代わりにOpenLayersを使用する場合は簡単ですが、Google Maps Util Libraryを使用すると、Google Mapsでも同じことができます()。ズームアウトする場合、10x10ピクセルの領域に2000個の重なり合うアイコンを描画するのは少し役に立ちません。

あなたが私にあなたのコードを見せてくれれば、私はあなたに物事をスピードアップする方法についてもっと直接的なアドバイスを与えることができます。

于 2011-09-05T23:27:38.620 に答える
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));
  }
于 2011-09-06T08:09:51.347 に答える