gpt4 book ai didi

Javafx Scene.snapshot方法性能低下

转载 作者:行者123 更新时间:2023-12-02 12:15:27 49 4
gpt4 key购买 nike

我正在制作一个滑动动画以将一个场景切换到另一个场景,但是当我调用此方法时,它在切换场景时有延迟。我发现原因是类Scene的一个方法snapshot()。有没有人有解决办法?

代码:

public void switchScene(Scene target) {
Scene current = getPrimaryStage().getScene();
WritableImage beforeImage;
WritableImage afterImage;

int width = ((int) ((Region) current.getRoot()).getWidth());
int height = ((int) ((Region) current.getRoot()).getHeight());

beforeImage = new WritableImage(width, height);
ImageView leftImage = new ImageView(current.snapshot(beforeImage));

afterImage = new WritableImage(width, height);
ImageView rightImage = new ImageView(target.snapshot(afterImage));

leftImage.setTranslateX(0);
rightImage.setTranslateX(width);

StackPane animation = new StackPane(leftImage, rightImage);
animation.setPrefSize(target.getWidth(), target.getHeight());

primaryStage.setScene(new Scene(animation));

Timeline timeline = new Timeline();
KeyValue kv = new KeyValue(rightImage.translateXProperty(), 0, Interpolator.EASE_BOTH);
KeyFrame kf = new KeyFrame(Duration.seconds(0.75), kv);
timeline.getKeyFrames().add(kf);
timeline.setOnFinished(t -> {
// remove pane and restore scene 1
primaryStage.setScene(target);
});
timeline.play();
}

最佳答案

以这种方式拍摄快照本质上是一种缓慢的操作,在 Java 领域中没有什么办法可以加快速度。正如评论中所建议的,如果您确实想拍摄快照,那么更好的方法是使用异步方法,该方法在运行时不会阻塞 UI 线程(因此,虽然它们仍然会延迟,但您的应用程序仍将保持响应。)

但是,如果我正确理解了你的示例,那么完全没有必要使用屏幕截图 - 为什么你要使用图像而不是仅仅对节点本身进行动画处理?请记住,所有 JavaFX 元素都是场景图的节点,因此可以以相同的方式进行动画处理。所以代替:

StackPane animation = new StackPane(leftImage, rightImage);

你应该能够做到:

StackPane animation = new StackPane(source, target);

...然后使用它直接为 Pane 设置动画,而无需经历缓慢的屏幕截图过程。

关于Javafx Scene.snapshot方法性能低下,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46216791/

49 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com