У меня есть небольшой тест, чтобы продемонстрировать проблему.Возможны ли параллельные операции рисования с помощью 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);
}
}
Это специальная версия [много раз задавалась] (http://stackoverflow.com/questions/1223072/how-do-i-top-im-to-multi-core-and-multi-cpu- computers-in-java) общий вопрос о том, может ли кодер контролировать, как потоки обрабатываются в многоядерной системе. –
В AWT есть большой замок. (Был как встроенный замок, но был изменен на «Lock» в JDK 6 по соображениям производительности, почти в то же самое время, когда HotSpot выровнял его блокировку с jucl.) Я думаю, что это может вступить в игру здесь. –
Спасибо Том. Я рассмотрю открытый источник jdk и посмотрю, что можно сделать. – Johnny