这是一个模糊的问题,但我正在尝试使用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?
答案 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/