0

ヘッダーから受信した新しいパケット メッセージごとに再描画するアニメーション ストリップ チャートを作成しています。最初に、チャートが既に存在するかどうかを確認し、存在しない場合は作成する関数を作成します。

function drawAccel() {
    if (chart == null) {
      chart = Stripchart(document.getElementById('accel'));
    }

    if (orienteer == null) {
      orienteer = Orienteer(document.getElementById('orienteer'));
    }

    chart.draw();
    orienteer.draw();
}

その後、受信したすべてのヘッダー パケットでチャートをループして再描画するこの関数を実行します。

function messagecb(header, message) {
    if(header.type == 6) {
      // echo reply
      // processEchoReply(message);
    }else if(header.type == 4) {
      // accel
      var accels = message.b64UnpackAccelMsg();

      for(var index in accels) {
          var accel = accels[index];
          var totalClock = accelEpochAdjust(accel.clock);

          addAccelDatum(totalClock, accel.x,  accel.y, accel.z);
      }

      drawAccel();

} else if(header.type == 3) {
    // info
    var info2 = message.b64UnpackInfo2Msg();

    displayCurrentPosition(info2.fixtime, info2.lat, info2.lon, info2.alt);
    displayMobileStatus(info2.rssi, info2.bandClass, info2.batt);
} else if(header.type == 11) {
    btReceive(header, message);
  }
}

この方法を使用するすべての最新のブラウザーで問題はありませんが、IE8 では非常に遅くなります。これにより、実行速度の遅いスクリプト エラーが発生し、最終的にアプリが壊れてしまいます。また、グラフが視覚的に変化していなくても、現在のロジックが原因でチャートが再描画されていると思いますが、それを確認する方法がわかりません。長々と申し訳ありませんが、どんな助けでも大歓迎です!

4

2 に答える 2

1

これはあまり役に立たないかもしれないので、反対票を投じないでください。

私は同様の問題を抱えていて、非常に多くのパケットごとに、または次のような設定された時間枠でのみ再描画しました。

var mycars = new Array();
var count = 0;

function newPakcet(pck) {
    mycars[mycars.length + 1] = pck;
    redraw();
}
var redrawSize = 10;

function redraw(pck) {
    if (mycars.length > 10) {
        for(var i = 0 ;i < mycars.length;i++){
            //Draw here
        }
       mycars = new Array();
    }
}

テストしていないため、構文エラーがさらに発生する可能性があります。

于 2013-05-23T15:53:14.100 に答える
0

いくつかの試行錯誤と他の誰かからの少しの助けの後、これは問題を解決することになりました. 10 の倍数かどうかを確認できるカウンターとして機能するように、グローバルではなくローカル変数を設定します。10 番目のパケットごとに描画するように、描画関数をラップします。

function messagecb(header, message) {
    if(header.type == 6) {
      // processEchoReply(message);

    } else if(header.type == 4) {
        var accels = message.b64UnpackAccelMsg();

    for(var index = 0; index < accels.length; ++index) {
        var accel = accels[index];
        var totalClock = accelEpochAdjust(accel.clock);

        addAccelDatum(totalClock, accel.x,  accel.y, accel.z);
    }

    if ( typeof messagecb.counter == 'undefined' ) {
      messagecb.counter = 0;
    }

    ++messagecb.counter;
    if (messagecb.counter % 10 == 0) {
      drawAccel();
    }

  } else if(header.type == 3) {
      // info
      var info2 = message.b64UnpackInfo2Msg();

      displayCurrentPosition(info2.fixtime, info2.lat, info2.lon, info2.alt);
      displayMobileStatus(info2.rssi, info2.bandClass, info2.batt);
  } else if(header.type == 11) {
      btReceive(header, message);
  }
}
于 2013-05-24T05:11:33.023 に答える