JavaFX具有更大的Canvas维度的巨大延迟

时间:2014-08-11 02:30:39

标签: java performance canvas javafx

这是一个模糊的问题,但我正在尝试使用JavaFX Canvas技术创建一个代码编辑器,它对我喜欢的东西来说非常慢。

以下面的代码为例

public class JavaFXApplication13 extends Application {


    @Override
    public void start(Stage primaryStage) {
        BorderPane root = new BorderPane();
        int extent = 6300;
        System.out.println(System.getProperty("java.version"));
        Canvas cvs = new Canvas(extent,extent);
        ScrollPane scpn = new ScrollPane();
        root.setTop(cvs);
        scpn.setContent(root);

        root.autosize();
        scpn.autosize();
        GraphicsContext ctx = cvs.getGraphicsContext2D();
        for(int i = 0; extent / 300 > i; i++){
            ctx.setFill(Color.RED);
            ctx.fillRect(i*300, 0, 100, extent);
            ctx.setFill(Color.BLUE);
            ctx.fillRect(i*300+100, 0, 100, extent);
            ctx.setFill(Color.GREEN);
            ctx.fillRect(i*300+200, 0, 100, extent);
        }
////        root.getChildren().add(btn);

        Scene scene = new Scene(scpn, 300, 250);
        primaryStage.setTitle("Hello World!");
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        launch(args);
    }

}

如果您尝试滑动窗格,则在移动光标和滚动条与滚动窗格更新之间需要几秒钟。这与画布的大小有关,它设置为6300,这没什么。我可以打开NotePad并获得百万行的高度,并且能够轻松地绘制它们。

在尝试使用大尺寸画布时,性能更差,简单

 onKeyPress((a) -> drawText(a.getText(), ...));

需要几秒钟才能处理。

我想我想说的是,这种表现是否正常?或者我应该把它搞砸并转向更强大的东西,比如OpenGL?

2 个答案:

答案 0 :(得分:3)

我在大约6个月前测试了一个游戏项目的JavaFX,我正在绘制10000个矩形并使用动画计时器来改变每个矩形的颜色,每秒60次。

我发现使用画布的速度非常慢,而且每秒钟都会出现一帧。我改为只使用场景图,只需将JavaFX矩形节点添加到一个组节点,它没有滞后。

我很惊讶使用JavaFX对象比使用画布更有效率,我现在正在使用场景图中的节点开发第二个JavaFX 2游戏。

答案 1 :(得分:3)

代码编辑器应该是虚拟的,只绘制你在屏幕上看到的线条!所以恕我直言,你使用画布是完全错误的!

Canvas的核心可以看作是一个可以在OpenGL / Directx一侧绘制的缓冲图像,只能看到图像。

为什么重新发明轮子至少有2个opensource javafx代码编辑器。请参阅https://tomasmikula.github.io/blog/http://tomsondev.bestsolution.at/2014/08/11/efxclipse-1-0-new-features-styledtext-control-to-build-a-code-editor-framework/