【问题标题】:How to increase draw speed of lines on canvas in Javafx如何在 Javafx 中提高画布上线条的绘制速度
【发布时间】:2016-10-19 05:44:26
【问题描述】:

我正在用 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 中使用线条功能。但是,所有这一切的问题在于,该行“滞后”在光标之后,并且在光标以正确的速度移动时非常重要。那么问题来了:这和我的draw函数、canvas绘图函数、mouseListener的刷新率或者其他的东西完全有关系,还是一起? 非常感谢对此的一些建议。

【问题讨论】:

    标签: java canvas javafx graphics drawing


    【解决方案1】:

    在您的简单示例中,在重置功能中使用背景颜色在之前的 x1,y1,x2,y2 线上绘制一条线,然后绘制新线会更有效。

    但是,如果你移动 1 px,用户不太可能注意到差异。

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

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

    【讨论】:

    • 对,我没想到。谢谢!我一定会试试这个。
    【解决方案2】:

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

    【讨论】:

    • 我应该做一个画图应用程序。所以画布是我的画板,所有的线条、形状等都被绘制出来。我已经制作了一个图层系统,这样对于每个图层,我都会添加一个 Canvas 并将此画布 GraphicsContext 设置为当前图层。我只想将它们添加到窗格而不是使用画布。您认为这会是更好的方法吗?
    • 这在很大程度上取决于您的程序的性质。如果它的性质更像是一个矢量绘图程序,并且您需要在绘制几何图形后对其进行编辑,那么使用窗格可能是更好的选择。
    【解决方案3】:

    问题可能不是绘图速度,而是类似于问题中讨论的输入反应延迟: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 一样简单(当然,用我的值替换为您的应用程序的适当值)。

    【讨论】:

    • 谢谢!一定会检查出来的!
    • 我看到您提供了一个解决方案,设置未记录的 JVM 标志 -Djavafx.animation.fullspeed=true。我该如何开始呢?
    猜你喜欢
    • 2014-07-19
    • 2014-02-16
    • 2017-06-01
    • 2018-11-13
    • 1970-01-01
    • 2017-09-11
    • 1970-01-01
    • 2019-10-23
    • 2019-11-11
    相关资源
    最近更新 更多