Java awt / swing AffineTransformation для перемещения по фигурам - PullRequest
1 голос
/ 19 ноября 2010

Программа, которая анимирует круги, не рисует их плавно, как только несколько сотен нарисованы одновременно.Было предложено использовать аффинное преобразование для копирования фигур.Этот код, реорганизованный для использования graphics2D, работает, но не вызывает никакого повышения производительности, поскольку он все еще заполняет сотни овалов.Как правильно использовать аффинетрансформацию, чтобы заполнить форму один раз, а затем скопировать / переместить ее?


    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        setBackground(Color.WHITE);</p>

<pre><code>    for (int i = 0; i < gameLogic.getParticleArrSize(); i++) {
        Graphics2D g2 = (Graphics2D) g;
        Color color = new Color(6,6,6);
        Ellipse2D oval = new Ellipse2D.Double(
                gameLogic.getParticleXCoor(i),
                gameLogic.getParticleYCoor(i),
                gameLogic.getParticleSize(i),
                gameLogic.getParticleSize(i));
        g2.setPaint(color);
        g2.fill(oval);
        g2.translate(15, 15);
        g2.fill(oval);
  }

}

Ответы [ 2 ]

1 голос
/ 19 ноября 2010

Сомневаюсь, что это будет иметь большое значение, но:

  1. Нет необходимости создавать новые объекты Color внутри цикла
  2. Вместо хранения нескольких массивов x, y, widthзначения высоты сохраняют ArrayList объекта Ellipse2D, поэтому вам не нужно создавать эти объекты заново.

Я также видел пример, в котором без проблем используется 5000 шаров.Он использует метод fillOval (...).Не знаю, будет ли это иметь значение.

1 голос
/ 19 ноября 2010

Единственный способ узнать, что быстрее, - профилировать две или более реализации. В качестве конкретного примера, эта кинетическая модель демонстрирует небольшое преимущество для режима Gradient , использующего режим drawImage(), над Color , используя fill(), как видно в paintComponent() методе DisplayPanel. В этом контексте AffineTransform полезен для предварительного рендеринга более сложного градиентного изображения.

Добавление:

Я не знаю, как правильно реализовать AffineTransform для перемещения / копирования овалов ...

Я сомневаюсь, что AffineTransform - это лекарство. Вместо этого переместите создание объекта из цикла, как предлагает @camickr. В примере обратите внимание, что Ensemble нужен только один Ellipse2D; он использует setFrame() повторно. Кроме того, каждый Particle уже знает его Color. Наконец, посмотрите, как пример измеряет время рисования.

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