我有一个 JavaFX Group
添加了一个 Path
节点,我每秒大约向其中添加数据 30 次。这导致我的整个 GUI 在大约一分钟后变得非常滞后且没有响应。
首先,我将路径添加到 Group
,如下所示:
root.getChildren().add(path);
数据是这样添加的:
while(true) {
// Calculate x and y...
path.getElements().add(new LineTo(x, y));
path.getElements().add(new MoveTo(x, y));
// Sleep 33 milliseconds...
}
如果我没有将路径添加到组中,但之后仍然添加数据,GUI 仍保持响应,因此性能问题似乎是在绘制路径的形状时。为什么?我可以做些什么来提高性能?这是已知会发生还是我做错了什么? 谢谢!
最佳答案
JavaFX 2.1 中存在一个与路径性能相关的已知问题 (creating paths is very slow),而 JavaFX 2.2 中存在另一个 Unresolved 类似问题 (improve path rendering performance)。查看JavaFX issue tracker system可能还有其他问题.对于目前正在开发中的JavaFX8,很多元素的性能已经vastly improved .
您可以尝试的另一种方法是使用 Canvas而不是路径。不过,这取决于您的用例,对于某些用例,这将是一个合适的替代品,而对于其他用例,则不是。
如果您可以创建一个简短的可重现测试用例并为其提交 JavaFX 问题,JavaFX 团队将调查您看到的任何性能问题,如果它们是由底层系统实现引起的,则可能会解决这些问题。
您还应该检查您的实现以了解以下内容:
- 不要在 JavaFX 线程上调用 sleep 。
- 不要在 JavaFX 线程上执行任何处理器密集型操作。
- 不要在 JavaFX 线程上执行阻塞 I/O。
- 不要在 SceneGraph 或 Path 中放置数万个节点。
- 从另一个线程读取或写入 SceneGraph 中的对象时,使用 Platform.runLater .
- 不要过于频繁地调用 Platform.runLater,否则最终会使事件处理系统过载。
并不是说您的代码存在上述任何问题,只是需要检查的内容。
关于JavaFX 2路径绘制性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12733051/