JavaFX Canvas延迟

Ren*_*ues 5 performance javafx canvas

我正在尝试将一些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)

实际上没有新元素的最大数量.根据用户需求,它可以从几百到几十万不等.是的,如果一些元素随着时间的推移而流行,那就没关系了.

Ren*_*ues 1

伙计们,我感谢你们的所有帮助。我向 OpenJFX 邮件列表发送了同样的问题,其中一位开发人员回答了。看来我的 JavaFX 2.2 版本仍然使用旧模型来增长命令缓冲区。新版本 JavaFX 8 使用更高效的模型,使第一次绘画与后续绘画一样快。

这是我得到的答案:

Jim Graham(oracle.com 上的 james.graham)

世界标准时间 2014 年 5 月 12 日星期一 21:17:19

这可能是由于命令缓冲区的增长,该缓冲区在某一点上是线性完成的(可能在 2.2 中仍然以这种方式完成),但现在在 8.0 中呈指数增长。在 8.0 中,第一次渲染时间几乎是瞬时的,但是当我用我的一个旧的 2.x 版本尝试它时,你发现需要很长时间......

      ...jim
Run Code Online (Sandbox Code Playgroud)