簡體   English   中英

如何在Javafx中增加畫布上線條的繪制速度

[英]How to increase draw speed of lines on canvas in Javafx

我正在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的刷新率或其他完全或其他所有內容有關? 非常感謝對此的一些建議。

我認為你在這里采取了一種完全錯誤的做法。 將Line節點放在畫布頂部並修改此行的幾何數據而不是不斷清除畫布並重新繪制線條會更容易,也更有效。 (你也應該問問自己,無論如何在這里使用Canvas是正確的做法,但這只是你可以決定的事情,因為你沒有提供任何關於你真正想用畫布做什么的信息。)

問題可能不是繪圖速度,而是輸入反應滯后類似於問題中討論的: 通過在javafx 2中拖動來移動節點的正確方法?

嘗試從鏈接問題的答案中的一些方法,看看它是否有幫助。

請注意,如果是這種情況,那么無論是使用畫布還是場景圖,都不會對性能問題產生影響,因為與輸入事件處理相關的問題與渲染系統相反。

相關錯誤跟蹤器票據: 跟蹤鼠標事件時的性能問題

我看到你已經給出了設置未記錄的JVM標志的解決方案

-Djavafx.animation.fullspeed=true

我怎么開始這樣做?

這不是我寫的解決方案,並且在將來的Java版本中可能會刪除未記錄的標志或修改其行為(盡管在這種情況下我認為這不太可能)。 不過值得嘗試。

要了解如何設置命令行標志,請參閱: 正確使用Java -D命令行參數以及標題為“-Dproperty = value”的java手冊頁部分。

它應該像輸入java -Djavafx.animation.fullspeed=true my package.MyMainClass一樣簡單java -Djavafx.animation.fullspeed=true my package.MyMainClassjava -Djavafx.animation.fullspeed=true myjar.jar (當然,用我的值代替你的應用程序的適當值)。

在您的簡單示例中,在復位函數中繪制具有前一個x1,y1,x2,y2線的背景顏色的線然后繪制新線將更有效。

但是,如果你移動1像素,用戶不太可能注意到差異。

如果用戶只是在坐標x1 = 50,y1 = 50到x2'= 51,y2'= 50或x2''= 50,y2 = 51的情況下玩,你仍然可以清除整個畫布,這對於只有1個非常愚蠢-2更改像素,對於可能有數千或數百萬像素的畫布。

但是,無論哪種方式,您都可以跳過一些重繪,而不會對用戶產生太大影響,以便優化速度。 因此,添加一個if來檢查先前x2和y2之間的差異是否大於x像素與當前x2和y2相比較

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM