Возможны ли параллельные операции рисования с Java Graphics2d? - PullRequest
2 голосов
/ 31 марта 2012

У меня есть небольшой тест, чтобы продемонстрировать проблему.

Очевидно, код работает, но при увеличении количества потоков (при условии, что ядер достаточно) производительность не улучшается.

Это как если бы операции рисования были сериализованы.

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 );
}
}

1 Ответ

0 голосов
/ 31 марта 2012

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

Итак, относительно вашего вопроса:

  • если вы хотите быстро рисовать параллельным / параллельным выполнением, вам нужно будет поделиться ссылкой BufferedImage или Graphics * между потоками.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...