1

一次绘制数百个圆形动画的程序不会流畅地绘制它们。建议使用仿射变换来复制形状。这段代码被重构为使用 graphics2D,可以工作,但不会导致任何性能提升,因为它仍在填充数百个椭圆。如何正确使用仿射变换来填充形状一次然后复制/移动它?


    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        setBackground(Color.WHITE);

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

}

4

2 回答 2

1

知道哪个更快的唯一方法是分析两个或多个实现。作为一个具体的例子,这个动力学模型显示了梯度模式的轻微优势,使用drawImage(), 优于颜色模式,使用fill(), 如 的paintComponent()方法所示DisplayPanel。在这种情况下,AffineTransform有利于预渲染更复杂的梯度图像。

附录:

我不知道如何正确实现AffineTransform移动/复制椭圆……</p>

我怀疑那AffineTransform是治疗方法。相反,正如@camickr 建议的那样,将对象创建移出循环。在这个例子中,注意一个Ensemble只需要一个Ellipse2D;它setFrame()反复使用。此外,每个人都Particle已经知道它的Color. 最后,观察该示例如何测量绘制时间。

于 2010-11-19T03:08:04.383 回答
1

怀疑它会产生很大的不同,但是:

  1. 无需在循环内创建新的 Color 对象
  2. 而不是保留 x、y、宽度、高度值的多个数组,而是保留 Ellipse2D 对象的 ArrayList,这样您也不必继续重新创建这些对象。

我还看到了一个使用 5000 个球没有问题的示例。它使用 fillOval(...) 方法。不知道这是否会有所作为。

于 2010-11-19T05:04:24.767 回答