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)
实际上没有新元素的最大数量.根据用户需求,它可以从几百到几十万不等.是的,如果一些元素随着时间的推移而流行,那就没关系了.
伙计们,我感谢你们的所有帮助。我向 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 版本尝试它时,你发现需要很长时间......
Run Code Online (Sandbox Code Playgroud)...jim
| 归档时间: |
|
| 查看次数: |
834 次 |
| 最近记录: |