2009-03-30 11 views
3

SWTキャンバスで任意の色のピクセルをプロットするための、すばやく簡単な方法をお探しです。これは恐ろしく恐ろしく遅いです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のキャンバスを塗りつぶすには、約2秒半かかります。 イメージをオフスクリーンで作成し、ピクセルを設定してイメージを描画することができます。これは高速ですが、具体的には、画像をキャンバス上のピクセル単位でプロットする漸進的なペイント効果が必要です。

答えて

1

徐々に300x300の領域を塗りつぶすように、いくつかのオフスクリーン画像を描画できます。この方法で、イメージの表示速度を制御できます。

+0

これは実際に私がやってしまったものです。一度に走査線を一杯にし、走査線を描く。この方法は約10倍高速です。本当にすごい。 – shoosh

4

私は、90,000のオブジェクトを割り当てて解放することがパフォーマンスを殺していると確信しています。Color SWTでは、各Colorオブジェクトがネイティブリソースを割り当てていることを覚えておいてください。なぜなら、それはdispose()です。つまり、Colorオブジェクトを割り当てて処分するたびに、JVMからネイティブコードに移行して戻す必要があります。

インスタンスを300x300ピクセルループ内にキャッシュしてから、ループの後にオブジェクトを処分できますか?最大限に多くのオブジェクトしか保持していないややインテリジェントなキャッシュが必要ですが、その後はエントリの一部を破棄しますが、これにより処理速度が向上するはずです大幅にです。

-3

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

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

、最終的にバッファリングされた画像を表示::

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

あなたがSetRGBはを見つけた場合を(

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

描画ループ内のあなたのピクセルを設定)遅い場合は、ビットマップデータに直接アクセスできます。

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

以降

raster[y * 300 + x] = int_rgb; 
+1

'BufferedImage'はAWT/Swingでのみ動作します。 – pvorb

関連する問題