我正在用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中,例如在Microsoft Paint中。不过,所有这些问题是,线路在光标后面的" laggs",以及光标以正确的速度移动时。因此,问题是:这与我的绘制功能,帆布绘图功能,鼠标静音器的刷新速率或其他东西有关,还是完全在一起?真的很感激这一点。
我认为您在这里遵循一种完全错误的方法。将线节点放在画布的顶部,然后修改此行的几何数据,而不是不断清除画布并重新绘制线条,将一条线节点放在画布顶部要容易得多,更有效。(您还应该问自己,无论如何,在这里使用帆布是否是正确的事情,但这是您只能决定的事情,因为您没有提供任何您真正想使用的画布的信息。)
问题可能不是绘图速度,而是输入反应滞后类似于问题中讨论的反应滞后:正确移动节点的方法通过拖动Javafx 2?
尝试一些方法,从链接问题的答案中,看看它是否有帮助。
请注意,如果是这种情况,那么您是否使用帆布或场景图不会真正改变与输入事件处理有关的问题而不是渲染系统。
相关的错误跟踪器票:跟踪鼠标事件时性能问题。
我看到您给出了一个解决方案,设置了无证件的JVM标志
-Djavafx.animation.fullspeed=true
我什至如何开始这样做?
这不是我编写的解决方案,并且要小心一点,即可能会删除无证件的标志或在将来的Java版本中修改其行为(尽管在这种情况下,我想这不太可能)。然而,值得尝试。
要了解如何设置命令行标志,请参见:正确使用Java -D命令行参数以及Java Man页面部分标题为:" -dproperty = value"。
它应该像键入java -Djavafx.animation.fullspeed=true my package.MyMainClass
或java -Djavafx.animation.fullspeed=true myjar.jar
一样简单(将我的值代替适合您的应用程序的值)。
在您的简单示例中,在重置功能中,在上一个x1,y1,x2,y2行上绘制背景颜色的线将更具效率,然后绘制新行。
但是,如果您移动1个PX,则用户不太可能注意到差异。
如果用户只是在坐标上播放x1 = 50,y1 = 50至x2'= 51,y2'= 50或x2''= 50,y2 = 51您仍然会清除整个画布,这对于只有1-2个更改的像素很愚蠢,对于可能拥有数千或数百万像素的画布。
但是,无论哪种方式,您都可以跳过一些重新绘制,而不会对用户产生太大影响,以优化一定的速度。因此,与当前的X2和Y2