2012-03-31 69 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- computers-in-java)關於編碼器是否可以控制在多核系統上如何處理線程的一般疑問。 – 2012-03-31 13:17:24

+2

AWT有一個大鎖。 (作爲固有鎖,但由於性能原因,在JDK 6中更改爲'Lock',幾乎與HotSpot使用jucl鎖定它的同時)。我認爲這可能會在這裏發揮作用。 – 2012-03-31 13:22:21

+0

謝謝湯姆。我會研究開放的jdk源代碼,看看是否可以做任何事情。 – Johnny 2012-03-31 14:44:34

回答

0

我從給定的代碼中看到,你在線程中分開執行「jobs」。每個線程創建「他自己的」BufferedImage並繪製一些東西。

所以,關於你的問題:

如果你想通過並行/併發執行快速繪製
  • ,您將需要共享的BufferedImage或圖形*線程之間的參考。
+0

事實上,正如Tom Hawtin所提到的,上述問題是所有通過AWT的繪圖操作都使用單個全局鎖。 – Johnny 2012-03-31 21:49:35

相關問題