当前位置: 首页 > 知识库问答 >
问题:

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

淳于升
2023-03-14

我正在用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());
}

正如您所看到的,使用鼠标侦听器来检测线开始的(x1,y1)位置,以及设置线应该结束的(x2,y2)位置,图形非常简单。正如您所看到的,我在绘制后清除线,这是我的意图,因为这是一个应该“显示”线应该去哪里的函数,例如在Microsoft Paint中使用线函数。然而,所有这些的问题是,这条线“滞后”在光标后面,并且非常接近光标以正确的速度移动的时间。所以问题是:这与我的绘图功能、画布绘图功能、mouseListener的刷新率或其他完全或全部有关吗?非常感谢您对此提出一些建议。

共有3个答案

夏博
2023-03-14

在您的简单示例中,在重置函数中用背景颜色在前面的x1、y1、x2、y2线上画一条线,然后画一条新线会更熟练。

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

如果用户只是在坐标x1=50、y1=50到x2'=51、y2'=50或x2"=50、y2=51处播放,您仍然会清除整个画布,对于只有1-2个变化的像素,对于可能有数千或数百万像素的画布来说,这是相当愚蠢的。

但是,无论哪种方式,您都可以跳过一些重绘',而不会对用户产生太大影响,以便优化速度。因此,添加一个if以检查与当前x2和y2相比,之前的x2和y2之间的差异是否大于x像素

刘升
2023-03-14

问题可能不是绘图速度,而是输入反应滞后,与问题中讨论的类似:通过在javafx 2中拖动来移动节点的正确方法?

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

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

相关错误跟踪记录单:跟踪鼠标事件时出现性能问题。

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

Djavafx.animation.fullspeed

我怎么开始这样做呢?

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

要了解如何设置命令行标志,请参阅:Java命令行参数的正确用法以及标题为:"-DProperty=value"的java手册页部分。

它应该像键入java-Djavafx一样简单。动画全速=真我的包。MyMainClass或java-Djavafx。动画全速=真正的myjar。jar(当然,用我的值替换应用程序的适当值)。

冷俊健
2023-03-14

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

 类似资料:
  • 我编写了这段代码,可以在JavaFX画布上绘制。它可以很好地工作,但我不知道如何重新绘制画布(比如在Swing中),以便在新画布上重新开始绘制。这是我的代码,非常感谢你的帮助!马里奥

  • 我目前正在使用画布开发一个JavaFX-Drawing-Application。在GraphicsContext的帮助下,我使用beginPath()和lineTo()方法绘制线条,但我无法找到实现橡皮擦的适当方法。

  • 我有以下代码应该在图像中绘制线条。我的代码是: 如果我编写,它实际上可以工作。但是我的数组很长并且来自一个输入。

  • 我可以绘制图像,但我如何旋转该图像例如45度并绘制它,然后绘制另一个图像与-50度旋转在同一画布? 不适用于我,因为它会旋转所有画布内容。

  • 有没有可能通过它们的方程式在画布中画出曲线呢?如果是,怎么做?假设我有一个数学方程y=0,5*x^2,如何打印方程的图形? 我尝试使用和方法,但未成功。

  • 我在这里尝试了一个JavaFX应用程序的代码,它允许我的手写笔在画布上画画:画布不会画平滑的线 当试图在画布上画画时,表演是极其痛苦的。它会冻结半秒,然后开始绘制。只有在它开始画画之后,它才是好的。不过,当你第一次用鼠标/笔按下时,延迟是相当残酷的,使其无法使用。