感觉JavaFX 2的绘图性能比Swing差。我认为原因之一是您如何绘制事物,例如,在绘制线条时,必须为每条线创建一个Line对象并将其添加到某个容器中,而在 Swing 中,只需获取一次 Graphics2D,然后在不创建每次都有新对象。那么,有没有更高效的方式来使用 JavaFX 2 进行绘制,例如,如果您必须绘制大约 3000 条弧线?什么是最好的“绘图表面”?目前我正在使用Group。感谢您的任何提示!
3 回答
您当前使用组的方法可能很好,并且您可能会发现在您的组内绘制 3000 条弧线的性能对于您的应用程序用户来说是完全可以接受的。
当前使用组的替代方法是使用布局窗格,这将添加一些方便的功能,但会增加额外的开销层,当您有数千个易于手动布局的对象时,这是不必要的。
有关JavaFX 2.2 即将推出的直接绘制接口(称为 Canvas 节点)及其含义的讨论,请参阅JavaFX 邮件列表存档。
尽管将对象粘贴到容器中似乎性能较差,但如果需要,容器实现可以利用现代 GPU 中内置的加速保留模式渲染硬件。另请注意,JavaFX 架构在内部跟踪脏区并缓存昂贵的渲染操作的结果以提高性能。因此,容器的使用本身并不意味着比可能依赖于立即模式实现的直接绘制接口更慢的性能。
选择绘图表面将取决于应用程序。大多数 JavaFX 应用程序的最佳表面将是场景图节点的集合,而不是画布节点。在场景图中使用多个节点而不是单个 Canvas 节点(通常)会更容易开发,并且性能将完全可以接受。
最终,很可能会写很多博客文章来比较 Canvas 与许多场景图对象的性能,并可能与其他框架(如 html canvas、java2d、swing 等)进行比较。因此,及时回答这样的问题会更容易.
有关的
Osvaldo 的JavaFX 性能分析虽然很老,但也包含对您问题中提出的一些问题的深入讨论。
在openjfx wiki中有一个很好的关于性能提示和技巧的部分。
有一些相关的 StackOverflow JavaFX 性能问题:
在 JavaFX 2.2 中,计划添加一个类似的对象,HTML5 Canvas
它非常适合您绘制大量 primitev 的需要。
有关详细信息,请参阅下一期附加的文档:http: //javafx-jira.kenai.com/browse/RT-17407
查看Pixel Graphics实验帖子中的提示。有两种方法,第一种Group
是使用ImageView
的,另一种是使用的。虽然我自己没有尝试过,但作者说这种ImageView
方法更快并且具有更好的可视化效果。另一方面,它使用不推荐使用的 API 方法。