一旦一次绘制了数百个圆圈,动画圆圈的程序就无法流畅地绘制它们。建议使用仿射变换来复制形状。这段代码被重构为使用graphics2D,可以工作,但不会导致任何性能提升,因为它仍然填充数百个椭圆。如何正确使用仿射变换来填充形状一次,然后复制/移动它?
public void paintComponent(Graphics g) {
super.paintComponent(g);
setBackground(Color.WHITE);<p></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);
}
</code></pre>
<p>}
</p>
最佳答案
了解哪个更快的唯一方法是分析两个或多个实现。作为一个具体的例子,这个kinetic model显示使用 drawImage()
的 Gradient 模式比使用 fill()
的 Color 模式稍有优势,如paintComponent()
中所示DisplayPanel
的方法。在这种情况下,AffineTransform
有利于预渲染更复杂的渐变图像。
附录:
I don't know how to properly implement
AffineTransform
to move/copy ovals…
我怀疑AffineTransform
是解决问题的方法。相反,将对象创建移出循环,如 @camickr 建议的那样。在 example ,请注意 Ensemble
如何只需要一个 Ellipse2D
;它重复使用setFrame()
。此外,每个粒子
已经知道它的颜色
。最后,观察 example 如何测量绘制时间。
关于Java awt/swing AffineTransformation 在形状周围移动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4221610/