2012-03-31 91 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

相关问题