3

SWT キャンバスに任意の色のピクセルをすばやく簡単にプロットする方法を探しています。これまでのところ、私はそのようなものを使用しています:

// initialization:
GC gc = new GC(canvas);

// inside the drawing loop:
Color cc = new Color(display, r, g, b);
gc.setForeground(cc);
gc.drawPoint(x, y);
cc.dispose();

これは恐ろしく遅いです。300x300 のキャンバスをピクセルで埋めるのに約 1 秒半かかります。画面外に画像を作成し、その中にピクセルを設定してから、画像を描画できます。これは高速ですが、キャンバス上にピクセルごとに画像をプロットする段階的なペイント効果が特に必要です。

4

3 に答える 3

4

パフォーマンスを低下させているのは、90,000個のColorオブジェクトの割り当てと解放であるに違いありません。SWTでは、各Colorオブジェクトがネイティブリソースを割り当てるため、必要になることを忘れないでくださいdispose()。つまり、オブジェクトを割り当てて破棄するたびにColor、JVMからネイティブコードに移行してから元に戻す必要があります。

Color300x300ピクセルのループ中にインスタンスをキャッシュし、ループの後にオブジェクトを破棄できますか?最大で非常に多くのオブジェクトのみを保持し、その後そのエントリの一部を破棄する、ある程度インテリジェントなキャッシュが必要になりますが、これにより処理が大幅に高速化されます。

于 2009-03-30T20:16:04.263 に答える
1

300x300 の領域を徐々に埋めるオフスクリーン画像をいくつか描画できます。このようにして、画像の表示速度を制御できます。

于 2009-03-31T00:15:32.160 に答える
-3

BufferedImage オブジェクトを作成します。

BufferedImage bi = new new BufferedImage(300, 300, BufferedImage.TYPE_INT_RGB);

描画ループ内でピクセルを設定します:

bi.setRGB(x, y, int_rgb);
...

最後にバッファリングされた画像を表示します:

g.drawImage(bi, 0, 0, null); 

setRGB() が遅い場合は、ビットマップ データに直接アクセスできます。

int[] raster = ((DataBufferInt)bi.getRaster().getDataBuffer()).getData();

以降

raster[y * 300 + x] = int_rgb;
于 2011-12-20T13:14:17.777 に答える