【问题标题】:JavaFX ImageView display GIFanimation high GPU [closed]JavaFX ImageView 显示 GIFanimation 高 GPU [关闭]
【发布时间】: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 版本:

  1. 尝试将 jdk 1.8.0_261 与 8.0.261-b12 版本中内置的 JavaFX 结合使用,得到了类似的结果。
  2. 尝试将 jdk 14.0.2 与 JavaFX 版本 15+9(最新的 openjfx-15)一起使用,仍然得到类似的结果。

简短摘要:升级 Java 和 JavaFX 版本并没有改变与此问题相关的任何内容。使用相同的尺寸会有所帮助,但我认为在您的帮助下我可以做得更好。

【问题讨论】:

  • 1.你真的认为有必要调查这样一个过时版本的 JavaFX 的性能问题吗? JavaFX 15 本周刚刚发布。 2. 你为什么不提供一个小的、可重复的例子。这会增加有人愿意花时间分析您的问题的机会。

标签: java animation javafx animated-gif


【解决方案1】:

我的猜测是,如果您使用一个或多个 RotateTransition 而不是关键帧动画,您可能会看到一些性能提升。

这是一个在ParallelTransition 中使用多个转换的简单示例:

import javafx.animation.RotateTransition;
import javafx.application.Application;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.paint.Color;
import javafx.scene.shape.Rectangle;
import javafx.stage.Stage;
import javafx.util.Duration;

public class Main extends Application {
    @Override
    public void start(Stage stage) {
        Group root = new Group();
        Scene scene = new Scene(root, 500, 200);
        stage.setScene(scene);

        Rectangle rect = new Rectangle (100, 40, 100, 100);
        rect.setArcHeight(50);
        rect.setArcWidth(50);
        rect.setFill(Color.VIOLET);
    
        RotateTransition rt = new RotateTransition(Duration.millis(3000));
        rt.setByAngle(180);
        rt.setAutoReverse(true);
    
        FadeTransition ft = new FadeTransition(Duration.millis(3000));
        ft.setFromValue(1.0);
        ft.setToValue(0.3);
        ft.setCycleCount(4);
        ft.setAutoReverse(true);

        ParallelTransition pt = new ParallelTransition(rect, ft, rt);
        pt.play();            

        root.getChildren().add(rect);

        stage.show();
    
    }
    public static void main(String[] args) {
        launch(args);
    }
}

【讨论】:

  • 使用一帧微调器并旋转它是个好主意,但它看起来不如我帖子中链接中的动画。在这个微调器中,如果您逐帧分析图像,您会注意到它不仅会旋转,还会改变颜色的不透明度,但这对于简单的微调器来说是个好主意。
  • 如果你想变得更漂亮,可以使用ParallelTransition 组合FadeTransitionRotateTransition 之类的转换。我编辑了适合的答案。
  • 会尝试,但我不确定为什么 java 在加载 gif 时会出现问题。过去我在使用 swing 作为 gui 时遇到过类似的问题。
猜你喜欢
  • 2018-03-12
  • 1970-01-01
  • 2015-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多