如何在Javafx中提高画布上线条的绘制速度

如何在Javafx中提高画布上线条的绘制速度,java,canvas,javafx,graphics,drawing,Java,Canvas,Javafx,Graphics,Drawing,我正在用Javafx制作一个基本的绘画应用程序。我想知道是否有办法提高画布上线条的绘制速度 public class MouseListener implements EventHandler<MouseEvent>{ @Override public void handle(MouseEvent event) { if(event.getSource() == canvas){ canvas.getParent().se

我正在用Javafx制作一个基本的绘画应用程序。我想知道是否有办法提高画布上线条的绘制速度

public class MouseListener implements EventHandler<MouseEvent>{

    @Override
    public void handle(MouseEvent event) {


        if(event.getSource() == canvas){
            canvas.getParent().setCursor(Cursor.CROSSHAIR);

        }


        if(event.getEventType() == MouseEvent.MOUSE_PRESSED){

            x1 = event.getX(); 
            y1 = event.getY(); 

        }else if(event.getEventType() == MouseEvent.MOUSE_MOVED){


            pGraphics.reset();

            x2 = event.getX();
            y2 = event.getY();

            mouseClick = 0; 

            pGraphics.drawLine(x1, y1, x2, y2);

        }


    }


public void drawLine(double x1, double y1, double x2, double y2){

    gc.strokeLine(x1, y1, x2, y2);

}

public void reset()
{
    gc.clearRect(0,0, gc.getCanvas().getWidth(), gc.getCanvas().getHeight());
}
公共类MouseListener实现EventHandler{
@凌驾
公共无效句柄(MouseeEvent事件){
if(event.getSource()==canvas){
canvas.getParent().setCursor(Cursor.CROSSHAIR);
}
if(event.getEventType()==MouseEvent.MOUSE_按下){
x1=event.getX();
y1=event.getY();
}else if(event.getEventType()==MouseEvent.MOUSE\u移动){
pGraphics.reset();
x2=event.getX();
y2=event.getY();
mouseClick=0;
图形绘制线(x1,y1,x2,y2);
}
}
公共空间抽绳(双x1、双y1、双x2、双y2){
锶克林(x1,y1,x2,y2);
}
公共无效重置()
{
clearRect(0,0,gc.getCanvas().getWidth(),gc.getCanvas().getHeight());
}
正如你所看到的,这幅画非常直接,使用鼠标侦听器来检测线条开始的(x1,y1)位置,设置线条应该结束的(x2,y2)位置也是如此。正如你所看到的,我在画完之后清除线条,这是我的意图,因为这是应该“显示”的功能线条应该放在哪里,例如在Microsoft Paint中使用线条功能。但所有这些的问题是线条“滞后”问题是:这与我的绘图功能、画布绘图功能、鼠标侦听器的刷新率或其他全部或全部有关吗?
如果您能提供一些建议,我将不胜感激。

在您的简单示例中,在重置功能中,在先前的x1、y1、x2、y2线上绘制一条带有背景色的线,然后再绘制新线会更有效

但是,如果移动1像素,用户可能不会注意到差异

如果用户只是在坐标上玩 x1=50,y1=50至x2'=51,y2'=50或x2'=50,y2=51 对于可能有数千或数百万像素的画布,您仍然会清除整个画布,这对于只有1-2个更改的像素来说是相当愚蠢的


但是,无论哪种方式,您都可以跳过一些重画,而不会对用户造成太大影响,以优化速度。因此,添加一个if,检查前一个x2和y2之间的差异是否大于x像素,与当前的x2和y2相比,我想您在这里采用的方法完全错误。这样会更简单、更安全只需在画布上放置一个线节点并修改该线的几何数据,而不是不断清除画布并重新绘制该线,效率会更高。(你还应该问问自己,在这里使用画布是否是正确的做法,但这是只有你才能决定的事情,因为你没有提供任何关于你真正想用画布做什么的信息。)

问题可能不是绘图速度,而是输入反应滞后,与问题中讨论的类似:

试着从相关问题的答案中选择一些方法,看看是否有帮助

请注意,如果是这种情况,那么无论您使用画布还是场景图都不会对性能问题产生真正的影响,因为与输入事件处理相关的问题与渲染系统相反

相关错误跟踪票证:


我看到您已经给出了设置undocumented JVM标志的解决方案

-Djavafx.animation.fullspeed=true

我该如何开始这样做呢

这不是我编写的解决方案,请注意,未记录的标志可能会在将来的Java版本中被删除或其行为会被修改(尽管在本例中,我认为这不太可能)。尽管如此,还是值得尝试

要了解如何设置命令行标志,请参见:以及标题为“-Dproperty=value”的部分


它应该很简单,只需键入
java-Djavafx.animation.fullspeed=true my package.MyMainClass
java-Djavafx.animation.fullspeed=true myjar.jar
(当然,将我的值替换为应用程序的适当值).

是的,我没有想过。谢谢!我一定会试试这个。我应该做一个绘画应用程序。所以画布是我的画板,所有的线条、形状等都在这里绘制。我制作了一个图层系统,这样对于每一层,我都会添加一个画布,并将这个画布图形上下文设置为当前的。我想到的只是广告将它们放置在窗格中而不是使用画布。你认为这是一种更好的方法吗?这在很大程度上取决于你的程序的性质。如果它的性质更像一个矢量绘图程序,并且你需要在绘制完几何图形后编辑几何图形,那么使用窗格可能是更好的选择。谢谢!我一定会检查的!我看到你了我已经给出了一个解决方案,设置未记录的JVM标志-Djavafx.animation.fullspeed=true。我该如何开始这样做?