1

FXML 性能是 JavaFX 的一个问题,如果您有复杂的屏幕并将它们分成使用 FXML 的小组件(为了可维护性/重用),那么它会变得非常慢。

由于 FXML 解析是在 UI 线程中进行的(不确定这一点,它仍然会阻止 JavaFX 应用程序线程),因此在处理 FXML 时,您无法在 JavaFX 中显示玻璃窗格/弹出窗口等。

我发现的唯一解决方法是在 FXML 为正在加载并在不再解析 FXML 文件时关闭它。

为此,我在 FXMLLoader 上方构建了一个外观。这也适用于 OpenGL 库(例如 LWJGL,而不是 Swing,任何 UI 和不在 JavaFX 应用程序线程中的东西都可以工作)。

我想知道是否存在更好的解决方案(仅限 JavaFX,不混合 UI 框架),因为这人为地增加了项目的复杂性,并且不能很好地与 OpenJFX 端口一起移植。

4

1 回答 1

3

推荐解决方案

使用 JavaFX 8u40+,您可以找到早期访问版本

对于 8u40,修复了以下错误:

此修复允许您在 JavaFX 应用程序线程之外创建所有控件(当前 WebView 除外)。这意味着您可以将 FXML 异步加载到标准 JavaFX Task中的 JavaFX 应用程序线程。在任务运行时,您可以显示请等待对话框或动画进度指示器或任何您喜欢的内容(在 JavaFX 中,无需使用其他框架,如 Swing/LWJGL)。

我最喜欢的处理方式是在向用户显示登录提示或需要创建一些输入时加载 FXML 元素(但您是否使用“在等待用户输入时在后台加载内容”技巧取决于应用程序)。

您还可以在应用程序的init函数中加载 FXML,以便在 JavaFX 系统启动时并行加载 FXML(您需要注意线程化,以确保您实际上不会尝试显示您的场景,直到加载所有 FXML 并且显示场景的操作发生在 JavaFX 应用程序线程上)。

替代解决方案

您也可以尝试将此解决方案将 FXML 转换为 Java 作为构建的一部分,那么 FXML 的缓慢加载可能不会有任何问题(因为不再有任何 FXML,它已被转换为 Java)。但我不知道该解决方案目前是否成熟且稳定,足以满足您的目的。

于 2014-12-04T22:52:59.343 回答