我觉得JavaFX 2的绘图性能比Swing差。我认为其中一个原因是你如何画画,例如在绘制一条线时,必须为每条线创建一个Line对象并将其添加到某个容器中,而在Swing中,只需获取一次Graphics2D,然后在不创建新对象的情况下执行drawLine。那么,是否有更高效的方法可以使用JavaFX 2进行绘制,例如如果你必须绘制约3000个弧?什么是最好的“绘图表面”?目前我正在使用Group。谢谢你的提示!
答案 0 :(得分:14)
您当前使用群组的方法可能很好,您可能会发现在您的群组中绘制3000弧形的效果完全可以为您的应用程序用户所接受。
使用Group的当前替代方法是使用布局窗格,这将添加一些方便的功能,但添加额外的开销层,当您有数千个轻松手动布局的对象时,这是不必要的。
有关JavaFX 2.2即将推出的直接绘制界面(称为Canvas Node)的讨论及其含义,请参阅JavaFX mailing list archive。
虽然在容器中粘贴对象可能看起来效率较低,但是如果愿意,容器实现可以使用现代gpus中内置的加速保留模式渲染硬件。另请注意,JavaFX体系结构在内部跟踪脏区域并缓存昂贵的渲染操作的结果以提高性能。因此,容器的使用本身并不意味着比可能依赖于立即模式实现的直接绘制接口更慢的性能。
选择绘图表面取决于应用程序。大多数JavaFX应用程序的最佳表面将是场景图节点的集合,而不是画布节点。使用场景图中的许多节点而不是单个Canvas节点(通常)将更容易开发,性能将完全可以接受。
最终,很可能会写很多博客文章来比较Canvas与许多scenegraph对象的性能,也许还有其他框架,如html canvas,java2d,swing等等。所以及时,它会更容易回答这样的问题。
相关
Osvaldo的JavaFX performance analysis虽然陈旧,但也包括对你问题中提出的一些问题的深入讨论。
Performance Tips and Tricks中的openjfx wiki有一个很好的部分。
有一些相关的StackOverflow JavaFX性能问题:
答案 1 :(得分:2)
在JavaFX 2.2中,计划添加类似于HTML5 Canvas
的对象,理想情况下,您需要绘制大量的原始数据。
有关详细信息,请参阅下一期附带的文档:http://javafx-jira.kenai.com/browse/RT-17407
答案 2 :(得分:1)
查看Pixel Graphics实验帖子中的提示。有两种方法,在第一个Group
中使用ImageView
,在另一个中使用ImageView
。虽然没有自己尝试,但作者说{{1}}方法更快,可视化更好。另一方面,它使用弃用的API方法。