【问题标题】:JavaFX Canvas Rendering PerformanceJavaFX 画布渲染性能
【发布时间】:2015-08-09 16:39:35
【问题描述】:

我在 JavaFX 应用程序上工作,并且必须绘制很多 (4000) 弧。 我正在使用图形上下文的JavaFX Canvas方法strokeArc。

应用程序执行得很弱,但不是strokeArc方法的调用,我认为延迟发生在后面,可能在渲染时。 结果是,应用程序确实需要大约 5 秒的延迟才能在 gui 上显示弧线。

有没有更快的方法在 JavaFX 中绘制圆弧?

【问题讨论】:

    标签: performance canvas javafx


    【解决方案1】:

    不,没有。帆布是最快的。

    您没有提供 MCVE。我只是尝试了一个简单的应用程序。工作速度非常快,在 6 毫秒内绘制了 4000 条弧线。应用程序窗口立即显示。代码如下:

    import javafx.application.Application;
    import javafx.scene.Group;
    import javafx.scene.Scene;
    import javafx.scene.canvas.Canvas;
    import javafx.scene.canvas.GraphicsContext;
    import javafx.scene.paint.Color;
    import javafx.scene.shape.ArcType;
    import javafx.stage.Stage;
    
    public class ArcTest extends Application {
    
        public static void main(String[] args) {
            launch(args);
        }
    
        @Override
        public void start(Stage primaryStage) {
    
            Group root = new Group();
            Canvas canvas = new Canvas(300, 250);
    
            GraphicsContext gc = canvas.getGraphicsContext2D();
    
            root.getChildren().add(canvas);
            primaryStage.setScene(new Scene(root));
            primaryStage.show();
    
            drawShapes(gc);
    
        }
    
        private void drawShapes(GraphicsContext gc) {
    
            long time = System.currentTimeMillis();
    
            gc.setFill(Color.GREEN);
            gc.setStroke(Color.BLUE);
            gc.setLineWidth(5);
            for( int i=0; i < 4000; i++) {
                gc.strokeArc(10, 160, 30, 30, 45, 240, ArcType.OPEN);
            }
    
            System.out.println( System.currentTimeMillis() - time);
        }
    }
    

    除非您提供一些包含更多信息的代码(BlendMode 等),否则很难为您提供帮助。

    【讨论】:

    • 也许内置的 JavaFX Canvas 图形性能优化器意识到,在这里可以用一条相同的弧线绘制 4000 次 :-)
    • 谢谢。我已经尝试过你的源代码,它对于 4000 弧来说很快。问题是,我对弧的数量有误。我不仅要画 4000 条弧线,还要画 70,000 条弧线。为此,您的源代码也很慢。我认为没有更好的解决方案?
    • 请尝试使用 70,000 个弧的测试程序。你会看到,代码在 25 毫秒后完成,但是 Java 渲染有很长的延迟。
    • @mipa 昨天:不,没有这样的优化器
    • @jojo2100:那么你应该正确地表达你的问题。 4000 和 70000 差别很大。弧被写入 GrowableDataBuffer 并稍后绘制。这就是为什么你会有延迟。
    猜你喜欢
    • 2012-10-06
    • 1970-01-01
    • 1970-01-01
    • 2012-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多