2012-03-31 2 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-top-im-to-multi-core-and-multi-cpu- computers-in-java) общий вопрос о том, может ли кодер контролировать, как потоки обрабатываются в многоядерной системе. –

+2

В AWT есть большой замок. (Был как встроенный замок, но был изменен на «Lock» в JDK 6 по соображениям производительности, почти в то же самое время, когда HotSpot выровнял его блокировку с jucl.) Я думаю, что это может вступить в игру здесь. –

+0

Спасибо Том. Я рассмотрю открытый источник jdk и посмотрю, что можно сделать. – Johnny

ответ

0

Что я видел из данного кода, что вы выполняете в потоках отдельные «задания». Каждый поток создает «свой собственный» BufferedImage и рисует что-то.

Таким образом, относительно вашего вопроса:

  • , если вы хотите быстро сделать с помощью распараллеливания/параллельного выполнения, вам нужно будет делить BufferedImage или графика * ссылки между потоками.
+0

На самом деле, как упоминал Том Хотин, проблема заключается в том, что все операции рисования, проходящие через AWT, используют один глобальный замок. – Johnny

Смежные вопросы