【问题标题】:Java awt/swing AffineTransformation to move around shapesJava awt/swing AffineTransformation 在形状周围移动
【发布时间】:2010-11-19 02:29:10
【问题描述】:

一次绘制数百个圆形动画的程序并不能流畅地绘制它们。建议使用仿射变换来复制形状。这段代码被重构为使用 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);
  }

}

【问题讨论】:

    标签: java swing awt affinetransform


    【解决方案1】:

    了解哪个更快的唯一方法是分析两个或多个实现。作为一个具体的例子,这个kinetic modelGradient 模式下使用drawImage() 比在Color 模式下使用fill() 有一点优势,如@ 987654322@DisplayPanel的方法。在这种情况下,AffineTransform 有利于预渲染更复杂的渐变图像。

    附录:

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

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

    【讨论】:

    【解决方案2】:

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

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

    我还看到了一个使用 5000 个球没有问题的示例。它使用 fillOval(...) 方法。不知道会不会有影响。

    【讨论】:

      猜你喜欢
      • 2021-12-05
      • 2018-02-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-13
      • 2019-05-04
      • 1970-01-01
      相关资源
      最近更新 更多