【发布时间】:2020-09-11 13:28:30
【问题描述】:
我正在创建 JavaFX 应用程序并制作了加载场景。在这个场景中,我想显示一些文本,例如加载或初始化,并添加一些加载微调器动画图像作为正在加载的视觉通知。
我生成了一个通过 https://loading.io/ 创建的加载 .gif 动画,并像动画帧一样下载了它(多个 .png 文件)。
我注意到在 JavaFX Scene Builder 8.5.0 中,当我在 ImageView 中设置 .gif 时,我在 Windows 任务管理器中的 GPU 在 NVidia GeForce RTX 2070 显卡上上升了 20%,我认为这是一个问题.我使用 javafx 桌面应用程序进行了测试,以排除不是场景生成器应用程序产生的问题,并得到了类似的结果。
我尝试的下一步是使用 javafx.animation.Timeline 创建我的自定义动画。这是我从控制器初始化(URL 位置,ResourceBundle 资源)函数调用的初始化函数。该函数不使用 .gif 图片,它使用同一张 .gif 图片的多个 .png 图片作为框架。
private void initializeAnimation() {
imgLoading.setCache(true);
imgLoading.setCacheHint(CacheHint.SPEED);
Image[] images = new Image[31];
for(int i = 0; i <= 30; i++){
images[i] = new Image(getClass().getResourceAsStream("/es/main/gui/javafx/images/loading/frame-" + i + ".png"));
}
Timeline timeLine = new Timeline();
Collection<KeyFrame> frames = timeLine.getKeyFrames();
Duration frameGap = Duration.millis(100);
Duration frameTime = Duration.ZERO;
for (Image img : images) {
frameTime = frameTime.add(frameGap);
frames.add(new KeyFrame(frameTime, e -> imgLoading.setImage(img)));
}
timeLine.setCycleCount(Timeline.INDEFINITE);
timeLine.play();
}
在第一个版本中,我没有调用 .setCache() 和 .setCacheHint() 函数,后来我在测试同一代码的不同变体时添加了它们。我也尝试添加
-Dprism.forceGPU=true -Dsun.java2d.opengl=true -Dprism.order=es2,es1,sw,j2d
作为 VMOption 或我在此论坛上阅读的有关改进 java 图形相关设置的一些变体。最后,经过所有的更改,我的任务管理器的结果并没有发生太大的变化。在当前版本中,我在这个场景中使用了多达 17% 的 GPU。
当场景结束时,在没有 .gif 图像或时间轴的下一个场景中,我的 GPU 几乎下降到 0%。
运行配置:
处理器:i9-9900KF
显卡:GeForce RTX 2070
Java 版本“1.8.0_251”
JavaFX 版本“8.0.251-b08”
简短的摘要问题:如何在 JavaFX 中正确显示动画 .gif 图像,而不会对 GPU(或集成显卡时的 CPU)产生巨大的开销。
(编辑)14.09.2020 - Java 命名约定
第一件事我没有注意到我没有在我的 ImageView 上使用相同的大小,所以我为测试更改的第一件事是将 ImageView 调整为与我的 .gif 图像相同的大小(两个 ImageView 的宽度和高度相同和 .gif 图像)。通过此更改,GPU 百分比降低到大约 %5。
按照建议,我还升级了 Java 和 JavaFX 版本:
- 尝试将 jdk 1.8.0_261 与 8.0.261-b12 版本中内置的 JavaFX 结合使用,得到了类似的结果。
- 尝试将 jdk 14.0.2 与 JavaFX 版本 15+9(最新的 openjfx-15)一起使用,仍然得到类似的结果。
简短摘要:升级 Java 和 JavaFX 版本并没有改变与此问题相关的任何内容。使用相同的尺寸会有所帮助,但我认为在您的帮助下我可以做得更好。
【问题讨论】:
-
1.你真的认为有必要调查这样一个过时版本的 JavaFX 的性能问题吗? JavaFX 15 本周刚刚发布。 2. 你为什么不提供一个小的、可重复的例子。这会增加有人愿意花时间分析您的问题的机会。
标签: java animation javafx animated-gif