【问题标题】:JavaFX Canvas Efficient AnimationsJavaFX Canvas 高效动画
【发布时间】:2017-04-20 05:20:59
【问题描述】:

我正在使用 JavaFX Canvas 为 Shape 和 Polyline 对象随时间的运动设置动画。 目前,每帧,列表中每个形状或折线的X和Y位置都根据需要进行编辑并移动对象。 这导致大约 20-30fps

我尝试过的早期方法只是每帧清除画布并重新绘制每个对象。不存储对象列表。 这导致 60fps

第二种方法似乎是一种更混乱的方法,但会产生更好的帧速率。

是否有在 JavaFX 画布上制作动画的最佳实践或推荐方法?任何干净和推荐的东西都会产生良好的帧率?

非常感谢

【问题讨论】:

  • 能贴出代码吗?
  • 我怀疑您在第一个示例中使用的是画布。您无法通过仅更改某些形状的 x/y 位置来移动 JavaFX 画布上的任何内容。我猜你在这里谈论的是场景图。能否请您澄清一下。

标签: java animation canvas javafx


【解决方案1】:

我刚刚在 JavaLand 会议上讨论了这些问题。确实,对于具有基于路径的形状(如折线和多边形)的一般动画,使用 Canvas 是目前最快的标准选项。这是由于 JavaFX 中的一个错误造成的,它可以通过场景图使此类动画变慢。我已经报告了这个问题,并且正在修复错误。

https://bugs.openjdk.java.net/browse/JDK-8178521

在这个 JIRA 问题中,我指的是硬件与软件渲染,但它也会影响场景图与画布渲染,因为画布似乎不受此错误的影响。

【讨论】:

  • 请注意,错误报告下方的 cmets 提出了一种可能的解决方法:将系统属性 prism.cacheshapes 设置为 false。您可以使用 VM 参数 -Dprism.cacheshapes=false 从命令行执行此操作。如果您想以编程方式执行此操作,您显然必须在加载Application之前 这样做(我不知道为什么),这意味着您需要一个带有System.setProperty("prism.cacheshapes", "false"); 的单独主类和然后Application.launch(MyApplicationSubclass.class);.
  • 我怀疑这是一个好主意,除非您除了动画形状之外什么都不做。通常缓存形状是有意义的。
猜你喜欢
  • 2012-06-04
  • 2013-02-08
  • 2016-01-16
  • 2016-08-17
  • 2015-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-25
相关资源
最近更新 更多