【发布时间】:2014-05-30 21:22:40
【问题描述】:
我正在尝试将一些 Java2D 代码转换为 JavaFX,但遇到了关于 JavaFX Canvas 性能的问题。在某些时候,我必须在屏幕上画出成千上万个小圆圈。
我的问题是,在第一次绘图中,我的代码需要很长时间才能执行。但如果我必须进行第二次绘图,则只需绘制时间的一小部分(至少快 10 倍)。
我做错了什么吗?有什么办法可以防止这种初始延迟?
我写了这段代码来测试它。在这段代码中,我在 1000 x 1000 画布(之前构建)上的随机位置绘制了 500,000 个圆圈。我将此代码链接到按钮单击事件,第一次单击需要 10 秒才能执行。但是如果我再次点击,只需要0.025秒。
private void paintCanvas() {
long initTime = System.currentTimeMillis();
GraphicsContext cg = canvas.getGraphicsContext2D();
cg.setFill(Color.WHITE);
cg.fillRect(0, 0, canvas.getWidth(), canvas.getHeight());
cg.setFill(Color.rgb(0, 0, 0, 0.1));
Random rand = new Random();
for (int i = 0; i < 500000; i++) {
cg.fillOval(1000 * rand.nextFloat(), 1000 * rand.nextFloat(), 2, 2);
}
long endTime = System.currentTimeMillis();
System.out.println("Time spent on drawing:" + (endTime - initTime)/1000.0f);
}
实际上没有最大数量的新元素。根据用户的需要,它可以从数百到数十万不等。是的,如果一些元素随着时间的推移弹出来也没关系。
【问题讨论】:
-
我知道 500,000 的值是用来说明问题的,但是在您的目标应用程序中有多少,您需要绘制每帧的 new 元素的最大数量是多少?这样,答案可以更好地适应您的特定限制。另外,如果某些元素随着时间的推移“弹出”,应用程序是否可以?
-
嗨,jewelsea。实际上没有最大数量的新元素。根据用户的需要,它可以从数百到数十万不等。是的,如果一些元素随着时间的推移出现,那也没关系。
-
我还没有在javafx 8上测试过。但是,这是否意味着初始延迟是javafx 2.2中的一个错误并且已经在javafx 8.0+中解决了?
-
所以这个赏金对某人来说很容易获得,他们所要做的就是发布一个答案并引用 Jim Graham 的邮件列表评论。
标签: performance canvas javafx