2012-03-31 9 views
2

私はこの問題を示すためにここで少しテストをしました。Java Graphics2dで並列描画が可能ですか?

明らかにコードは機能しますが、スレッド数を増やすほど(十分なコアがあると仮定して)パフォーマンスは向上しません。

描画操作がシリアル化されているかのようです。

import java.awt.*; 
import java.awt.image.BufferedImage; 
import java.util.Date; 
import java.util.Random; 

public class Para2dTest { 

class DrawSomething implements Runnable { 

    @Override 
    public void run() { 

     Random r = new Random(); 

     long start = new Date().getTime(); 

     BufferedImage image = new BufferedImage(100, 100, BufferedImage.TYPE_INT_ARGB); 
     Graphics2D g2d = image.createGraphics(); 
     for (int i = 0; i < 100000; i++) { 
      Color c = new Color(r.nextInt(256), r.nextInt(256), r.nextInt(256)); 
      g2d.setPaint(c); 
      g2d.fillRect(0, 0, 100, 100); 
     } 
     g2d.dispose(); 

     long end = new Date().getTime(); 

     System.out.println(Thread.currentThread().getName() + " " + (end - start)); 
    } 
} 

public Para2dTest(int threads) { 

    for (int t = 0; t < threads; t++) { 
     Thread ds = new Thread(new DrawSomething()); 
     ds.start(); 
    } 
} 

public static void main(String[] args) { 

    System.setProperty("java.awt.headless", "true"); 

    int threads = 16; 
    if (args.length > 0) { 
     try { 
      threads = Integer.parseInt(args[0]); 
      System.out.println("Processing with " + threads + " threads"); 
     } catch (NumberFormatException e) { 
      System.err.println("Argument" + " must be an integer"); 
     } 
    } 

    new Para2dTest(threads); 
} 
} 
+0

これは、[何度も尋ねられる]の特定のバージョンです(http://stackoverflow.com/questions/1223072/how-do-i-optimize-for-multi-core-and-multi-cpu-マルチコアシステム上でスレッドがどのように処理されるかをコーダが制御できるかどうかについて一般的な質問があります。 –

+2

AWTに大きなロックがあります。 (本来のロックではあったが、パフォーマンス上の理由からJDK 6の 'Lock'に変更されました.JackclockとロックされているHotSpotとほぼ同じ時期にロックされていました)。 –

+0

おかげでトム。私はopen jdkのソースを調べ、何かができるかどうかを見ます。 – Johnny

答えて

0

私は与えられたコードから見て、スレッドで別々の "ジョブ"を実行していることを確認しました。各スレッドは、 "自分の" BufferedImageを作成し、何かを描画します。

だから、あなたの質問について:

  • あなたが並列化/同時実行により迅速描画したい場合、あなたは*スレッド間の参照をBufferedImageのか、グラフィックスを共有する必要があります。
+0

実際には、上記のTom Hawtinに言及されているように、AWTを経由するすべての描画操作は単一のグローバルロックを使用します。 – Johnny

関連する問題