5

リアルタイムで更新されるグラフを描きたい(右から大きくなる)。私が考えることができる最も効率的な方法は、x [0 .. width-2]から1ピクセル左にすべてをコピーしてから、x[width-1]に新しい値を描画することです。

私はAndroidの経験がほとんどありませんが、私が知る限り、Canvasはそのコンテンツをまったく操作していません。毎回画面全体を塗り直す必要がありますか?これにはスケーリングとスムージングが含まれるため、遅くなるのではないかと心配しています。

バイト[][]に描画し、これを使用して画面にペイントする必要がありますか(毎回バッファの内容を左にシフトします)?

4

4 に答える 4

1

パフォーマンスに関しては、プロファイリングなしでは言えません。

線画はターゲットの電話でハードウェアアクセラレーションされている可能性があり、フレームごとに線画プリミティブを使用してグラフを最初から描画する必要があります。

一方、画像バッファの簡単なピクセル操作は次のようになります。

適切なサイズの画像を作成し、「」にクリアしbackground_colorます。この画像にはsetpixel()機能が必要です。

各x時間のyを記録する値の配列があるので、どの列についても、最後にグラフをプロットした場所がわかります。

この" chart_image"と" chart_array"を循環バッファとして扱います。各タイムステップについて:

Y = ...;
X = time_since_start % chart_width;
chart_image.setpixel(X,chart_array[X],background_color); // clear previous line
chart_array[X] = Y;
chart_image.setpixel(X,chart_array[X],foreground_color); // draw new plot

そして今、あなたはそれをブリットする必要があります。画像を2回ブリットする必要があります。

X = time_since_start % chart_width;
// the newest data is on the left of the chart_image but gets drawn on the right side of the output
blit(out_x+X,out_y, // destination coordinates
    chart_image,
    0,0, // top left of part of chart_image to blit
    X,chart_height); // bottom right of chart_image part
// the oldest data is on the right of the chart_image but gets drawn on the left side of the output
blit(out_x,out_y,
    chart_image,
    X,0,
    chart_width,chart_height);

個々のピクセルではなく線を使用したい場合は、さらに注意が必要ですがdrawline()、缶の代わりにsetpixel()このアプローチでも機能させることができます。

(Android APIを知らないことをお詫びしますが、アプローチは一般的です。)

于 2009-06-09T07:58:06.157 に答える
0

すでに考えているかもしれませんが、バッファの内容をシフトすることはしません。循環バッファのように使用してみます。現在の列のインデックスを保持し、左端の列に再度折り返すと、2つのセグメントで目的地に描画できます。現在の列の右側にあるものと、左側にあるものです。最後に入力された列。このように、何もシフトする必要はなく、各画面の更新は、2つのセグメントに対して2ブリット(ビットマップコピー)だけです。そのビットが遅すぎる場合でも、一度にすべてを画面にブリットする前に、常にそれらを2番目のオフスクリーンバッファーにペイントすることができます。確かに、画面への1つの大きなブリットはかなり速いですよね?

于 2009-06-08T12:13:15.930 に答える
0

グラフ データをメモリに保存していることは当然と考えられるため、再描画は問題になりません。フレームごとに一連のポイントを再描画することは、まったく集中的ではありません。必要なものだけを描画するのではなく、すべてを移動することになります。最悪の場合、これは時間の関数であるため、ディスプレイの列ごとに 1 つの値のみであり、システムが描画するランドスケープでは約 800 ピクセル/値です。些細なことです。これをプロファイリングしましたか?編集:システムが各ポイントを描画する必要があるわけではなく、メモリ上でのみ描画し、そのプリミティブを利用することを覚えておいてください。ポイントの描画、ビデオ メモリへのダンプ、そして再び繰り返しているとは思わないでください。

于 2012-01-03T19:02:55.723 に答える