2012-03-31 8 views
2

Ich habe hier einen kleinen Test, um das Problem zu demonstrieren.Sind parallele Zeichenoperationen mit Java Graphics2d möglich?

Offensichtlich funktioniert der Code, aber wie Sie die Anzahl der Threads erhöhen (vorausgesetzt, es gibt genügend Kerne) Leistung verbessert sich nicht.

Es ist, als ob Zeichenoperationen serialisiert sind.

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

Dies ist eine spezielle Version der [viele Male gefragt] (http://stackoverflow.com/questions/1223072/how-do-i-optimize-for-multi-core-and-multi-cpu- Computer-in-Java) generelle Frage, ob der Coder steuern kann, wie Threads auf einem Multicore-System verarbeitet werden. –

+2

Es gibt ein großes Schloss in AWT. (War als intrinsische Sperre, wurde aber in JDK 6 aus Performance-Gründen in ein 'Lock' geändert, fast zur gleichen Zeit, als der HotSpot seine Sperre mit jucl aufräumte.) Ich denke, dass das hier ins Spiel kommen könnte. –

+0

Danke Tom. Ich werde in die offene jdk-Quelle schauen und sehen, ob etwas getan werden kann. – Johnny

Antwort

0

Was ich von bestimmtem Code zu sehen, dass Sie in Threads ausgeführt werden trennen "Jobs". Jeder Thread erstellt "sein eigenes" BufferedImage und zeichnet etwas.

Also, in Bezug auf Ihre Frage:

  • , wenn Sie schnell durch Parallelisierung/gleichzeitige Ausführung zeichnen möchten, müssen Sie BufferedImage oder Grafiken * Bezug zwischen Threads teilen.
+0

Eigentlich wie von Tom Hawtin oben erwähnt, ist das Problem, dass alle Zeichenoperationen, die AWT durchlaufen, eine einzige globale Sperre verwenden. – Johnny