【发布时间】:2020-11-23 20:02:05
【问题描述】:
我有一个Brush 课程
final class Brush
{
private final int size;
private final Color color;
private final Ellipse2D.Double blob=new Ellipse2D.Double();
private Brush(int size,Color color)
{
this.size=size;
this.color=color;
}
void paint(Graphics2D g2d,Point location)
{
g2d.setColor(color);
blob.setFrame(location.x-(size/2.0),location.y-(size/2.0),size,size);//Translate ecllipse so that the centre of it's bounding box is exactly at the cursor location for more accurate blobs
g2d.fill(blob);
}
}
我有一个Blob 类,它跟踪用户当前的画笔设置以及用户之前拖动鼠标的位置,以便记住在那里绘制斑点。
final class Blob
{
final Brush brush;
final Point location;
private Blob(Brush brush,Point location)
{
this.brush=brush;
this.location=location;
}
private void paint(Graphics2D g){brush.paint(g,location);}
}
最后我的绘制逻辑非常简单。
每当用户拖动鼠标时,使用当前画笔设置在当前位置添加一个 blob,并在 paint() 内部循环遍历所有 blob 并重绘它们。
final class Painter extends Canvas
{
private Brush brush=new Brush(5,Color.red);//Can Change
private final ArrayList<Blob> blobs=new ArrayList();
private Painter(){addMouseMotionListener(new Dragger());}
@Override
public void paint(Graphics g)
{
super.paint(g);
blobs.forEach(blob->blob.paint(g));
}
private final class Dragger extends MouseAdapter
{
@Override
public void mouseDragged(MouseEvent m)
{
blobs.add(brush,m.getPoint());
repaint();
}
}
}
您已经可以在此处看到问题所在。列表的大小呈指数增长,我的应用程序迅速变慢。有没有更有效的方法来做到这一点?
【问题讨论】:
-
您是否正在尝试创建 ms 绘画?有趣的项目,开源吧。
-
我的聊天应用程序的迷你版。有望在今年年底前在 GitHub 上发布 :)
-
“列表的大小呈指数增长” 不,它以线性方式增长(除非我在上面的代码中遗漏了什么)。 非常不同的东西。 “..我的应用程序很快变慢了。” 我不相信。发一个minimal reproducible example,我们可以在本地测试。