我正在尝试将一些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);
}
Run Code Online (Sandbox Code Playgroud)
实际上没有新元素的最大数量.根据用户需求,它可以从几百到几十万不等.是的,如果一些元素随着时间的推移而流行,那就没关系了.