私はいくつかのリアルタイムデータをグラフ化しようとしています。ここでの「リアルタイム」とは、10ミリ秒未満のデータ、理想的には可能な限り低いデータを意味します。私はAndroidにこれほど高速にデータをフェッチして処理させることができましたが、ACEはリアルタイムでの使用を念頭に置いて設計されていないように見えます。最初の症状は、ガベージコレクターが明日がないように起動し、アプリを完全に強制終了することです。私は「スライディングウィンドウ」方式でデータを視覚化しているので、ACEがリアルタイムで数十万のポイントをプロットすることを期待しているわけではありません。私はそれを見てみましたが、onDraw for XYChartは、便利でコードがはるかに読みやすくなるが実際には必要ないように見える場合に、確かに非常に多く割り当てられます。これは以前よりもさらに悪い可能性があるため、まだ気づいていない可能性があります。
return mXY.subMap(start, stop);
にとって:
return new TreeMap<Double, Double>(mXY.subMap(start, stop));
これにより、同時実行の問題を回避するために、onDrawの実行中に更新をキューに入れ、後でアトミック更新またはその行の何かで更新を処理する方がよい場合に、膨大な割り当てが作成されます(ただし元のサブマップに支えられています)。
ここでの本当に残念なことは、ACEが私が必要とするものに対して確かに十分に速いということです。それは私のハードウェアで必要なことを完璧に行うことができますが、再描画に非常に多くを割り当てるため、AndroidはGCに夢中になります。GCの実行中にすぐに割り当てが開始されるため、待機する必要があり、アプリはストップモーションムービーのように見え始めます。
ただし、本当の問題は、ACEを使用して4または6のラインチャート(タブレットアプリ)をリアルタイム(200ミリ秒未満のリフレッシュレート)で再描画できると期待するのは合理的ですか、それともそのような悪用に備えていないだけですか?答えがノーの場合。そこにあなたがお勧めしたい他のオプションはありますか?
編集20130109: リビジョン471は、小さなデータセットの場合にかなり改善されます。2.000ポイント/4チャート/100ミリ秒のリフレッシュレートは実行可能でスムーズです。ログには、クレイジー(約10 /秒)のように「GC_CONCURRENTが解放されました」と表示されますが、アプリをストップモーションのようにするショートッパーである「WAIT_FOR_CONCURRENT_GCblocked」は表示されません。3.000ポイント/1チャート/100ミリ秒では、明らかに滑らかではありません。logcatと吃音アプリで「WAIT_FOR_CONCURRENT_GCblocked」のなだれが再び発生します。ここでも、速度の問題はなく、メモリ管理の問題だけがあるようです。
ACEに魔法をかけるように頼んでいるように見えるかもしれませんが、テレメトリデータを1KHzで取得して保存するためにすべてのコードをリファクタリングした後、この壁にぶつかりました。ついに、アプリがGCをまったくトリガーせずにリアルタイムですべてを取得して保存するのを確認したら、グラフ化しようとしたときにACEで髪を引っ張りました:)