我正在用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的刷新率或其他完全或全部有关吗?非常感谢您对此提出一些建议。
在您的简单示例中,在重置函数中用背景颜色在前面的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像素
问题可能不是绘图速度,而是输入反应滞后,与问题中讨论的类似:通过在javafx 2中拖动来移动节点的正确方法?
尝试一下链接问题的答案中的一些方法,看看是否有帮助。
请注意,如果是这种情况,那么无论您使用画布还是场景图,都不会真正影响性能问题,因为它与输入事件处理相关,而不是渲染系统相关。
相关错误跟踪记录单:跟踪鼠标事件时出现性能问题。
我看到你已经给出了一个设置未记录JVM标志的解决方案
Djavafx.animation.fullspeed
我怎么开始这样做呢?
这不是我编写的解决方案,请注意,在将来的Java版本中可能会删除未记录的标志或修改其行为(虽然在这种情况下,我想这不太可能)。尽管如此,还是值得一试。
要了解如何设置命令行标志,请参阅:Java命令行参数的正确用法以及标题为:"-DProperty=value"的java手册页部分。
它应该像键入java-Djavafx一样简单。动画全速=真我的包。MyMainClass或java-Djavafx。动画全速=真正的myjar。jar(当然,用我的值替换应用程序的适当值)。
我认为你在这里采取了一种完全错误的方法。只需在画布上放置一个线节点并修改这条线的几何数据,而不是不断清除画布并重新绘制线,这将更容易、更高效。(你还应该问问自己,在这里使用画布是否是正确的做法,但这是只有你才能决定的事情,因为你没有提供任何关于你真正想用画布做什么的信息。)
我编写了这段代码,可以在JavaFX画布上绘制。它可以很好地工作,但我不知道如何重新绘制画布(比如在Swing中),以便在新画布上重新开始绘制。这是我的代码,非常感谢你的帮助!马里奥
我目前正在使用画布开发一个JavaFX-Drawing-Application。在GraphicsContext的帮助下,我使用beginPath()和lineTo()方法绘制线条,但我无法找到实现橡皮擦的适当方法。
我有以下代码应该在图像中绘制线条。我的代码是: 如果我编写,它实际上可以工作。但是我的数组很长并且来自一个输入。
我可以绘制图像,但我如何旋转该图像例如45度并绘制它,然后绘制另一个图像与-50度旋转在同一画布? 不适用于我,因为它会旋转所有画布内容。
有没有可能通过它们的方程式在画布中画出曲线呢?如果是,怎么做?假设我有一个数学方程y=0,5*x^2,如何打印方程的图形? 我尝试使用和方法,但未成功。
我在这里尝试了一个JavaFX应用程序的代码,它允许我的手写笔在画布上画画:画布不会画平滑的线 当试图在画布上画画时,表演是极其痛苦的。它会冻结半秒,然后开始绘制。只有在它开始画画之后,它才是好的。不过,当你第一次用鼠标/笔按下时,延迟是相当残酷的,使其无法使用。