如何在Javafx中增加画布上线条的绘制速度

时间:2016-06-17 11:40:38

标签: java canvas javafx graphics drawing

我正在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来检测线开始的(x1,y1)位置非常简单,同样适用于设置线应该结束的(x2,y2)位置。如你所见,我在绘制后清除了这条线,这是我的意图,因为这是应该“显示”该线应该去的位置的函数,例如在Microsoft Paint中使用线函数。然而,所有这一切的问题在于光线后面的线“滞后”,并且当光标以正确的速度移动时非常重要。所以问题是:这是否与我的绘图功能,画布绘图功能,mouseListener的刷新率或其他完全或其他所有内容有关? 非常感谢对此的一些建议。

3 个答案:

答案 0 :(得分:2)

我认为你在这里采取了一种完全错误的做法。将Line节点放在画布顶部并修改此行的几何数据而不是不断清除画布并重新绘制线条会更容易,也更有效。 (你也应该问问自己,在这里使用Canvas是否是正确的做法,但这只是你可以决定的事情,因为你没有提供任何关于你真正想用画布做什么的信息。)

答案 1 :(得分:1)

问题可能不是绘图速度,而是输入反应滞后,类似于问题中讨论的那样:correct way to move a node by dragging in javafx 2?

从链接问题的答案中尝试一些方法,看看它是否有帮助。

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

相关的错误跟踪器门票:Performance issue when tracking mouse events

  

我看到你已经给出了设置未记录的JVM标志的解决方案

     

-Djavafx.animation.fullspeed=true

     

我怎么开始这样做?

这不是我编写的解决方案,并且有点小心,可能会删除未记录的标志或在将来的Java版本中修改其行为(尽管在这种情况下我猜这不太可能)。不过值得尝试。

要了解如何设置命令行标志,请参阅:Proper usage of Java -D command-line parameters以及标题为“-Dproperty = value”的java man page部分。

应该像输入java -Djavafx.animation.fullspeed=true my package.MyMainClassjava -Djavafx.animation.fullspeed=true myjar.jar一样简单(用我的值替换您的应用程序的适当值)。

答案 2 :(得分:0)

在你的简单例子中,重置函数在前一个x1,y1,x2,y2线上绘制一条背景色的线条然后绘制新线条会更有效。

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

如果用户只是在坐标处玩 x1 = 50,y1 = 50到x2&#39; = 51,y2&#39; = 50或x2&#39;&#39; = 50,y2 = 51 对于可能有数千或数百万像素的画布,你仍然可以清除整个画布,对于只有1-2个变化的像素而言非常愚蠢。

但是,不管怎样,你可以跳过一些重绘&#39;对用户没有太大影响,以便优化一些速度。因此,添加一个if来检查先前x2和y2之间的差异是否大于x像素与当前x2和y2相比