【问题标题】:javafx rendering glitch in jre 1.8.0_60jre 1.8.0_60 中的 javafx 渲染故障
【发布时间】:2015-09-10 02:52:27
【问题描述】:

我有一个在 jre 1.8.0_45 中运行良好的 javaFX 8 应用程序,但今天有用户来找我有问题。经过一番调查,我意识到这与他最近发布的 jre 有关,特别是 1.8.0_60。 我正在阅读一个 GIS shapefile 并在我的版本中绘制多个路径到一个组(如 30.000 或更多),它有点慢但它工作得很好。在最新版本中,图像出现失真。绘制的路径不合适且不按比例绘制。

correct image generated under jre 1.8.0_45

distorted image generated under jre 1.8.0_60

所以我决定制作一个小测试应用程序,将问题与我可能正在做的任何其他事情分开。这样做时,我发现问题不仅在于在组上绘制路径,还在于绘制到画布上。此外,如果我设法重绘屏幕,图像会看起来很好。例如,我有一个与包含路径的 Group 的可见属性绑定的复选框,因此如果我将其设置为 false 然后为 true,则需要一些时间来绘制场景,但它看起来很好。测试应用程序非常简单,如果您按下一个按钮,您会生成一个带有一些正方形 10px10p 的画布,如果您按下另一个按钮,您会生成更多正方形,因此会出现渲染故障。

package gisUI;

import javafx.application.Application;
import javafx.application.Platform;
import javafx.scene.Group;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.canvas.Canvas;
import javafx.scene.canvas.GraphicsContext;
import javafx.scene.control.Button;
import javafx.scene.layout.HBox;
import javafx.scene.layout.Pane;
import javafx.scene.layout.VBox;
import javafx.scene.paint.Color;
import javafx.scene.paint.Paint;
import javafx.scene.shape.LineTo;
import javafx.scene.shape.MoveTo;
import javafx.scene.shape.Path;
import javafx.stage.Stage;

public class Path2DTestApplication extends Application {
    private static final int WIDTH = 10;

    Group content = new Group();

    @Override
    public void start(Stage stage) throws Exception {
        stage.setTitle("JavaFX 1.8.0_60 rendering test");

        Button button = new Button("Canvas 100 x 30");
        button.setOnAction(a->doGenerateCanvas(100,30));

        Button button2 = new Button("Canvas 100 x 400");
        button2.setOnAction(a->doGenerateCanvas(100,400));

        Button button3 = new Button("Paths 100 x 30");
        button3.setOnAction(a->doGeneratePaths(100,30));
        VBox vBox = new VBox();
        vBox.getChildren().addAll(new HBox(button,button2,button3),content);

        Group root = new Group();
        root.getChildren().add(vBox);

        Scene scene = new Scene(root,80*WIDTH,60*WIDTH);//, 1500, 800);//, Color.White);
        stage.setScene(scene);
        stage.show();
    }

    private void doGeneratePaths(int maxX,int maxY) {
        Pane paths = new Pane();
        content.getChildren().clear();
        Platform.runLater(()->{
        for(int i = 0;i<maxX;i++){
            for(int j=0;j<maxY;j++){
                paths.getChildren().add(getPath(i,j));
            }
        }   

        content.getChildren().add(paths);
        });
    }

    private void doGenerateCanvas(int maxX,int maxY) {  
        content.getChildren().clear();
        Platform.runLater(()->{
        Canvas canvas = new Canvas(maxX*WIDTH, maxY*WIDTH);
        GraphicsContext gc = canvas.getGraphicsContext2D();
        int counter =0;
        for(int i = 0;i<maxX;i++){
            for(int j=0;j<maxY;j++){
                gc.setFill(Color. rgb(255,(int) (Math.random()*255),191));
                double[] xCoords = new double[]{i*WIDTH, (i+1)*WIDTH, (i+1)*WIDTH, i*WIDTH};
                double[] yCoords = new double[]{j*WIDTH,(j)*WIDTH,(j+1)*WIDTH,(j+1)*WIDTH};
                gc.fillPolygon(xCoords,yCoords,xCoords.length);
                counter++;
            }
        }   
        System.out.println(counter +" polygons added");
        content.getChildren().add(canvas);
        });
    }

    protected Node getPath(int i,int j) {           
        Path path = new Path();     
        path.getElements().add(new MoveTo(i*WIDTH, j*WIDTH)); 
        path.getElements().add(new LineTo((i+1)*WIDTH, j*WIDTH)); 
        path.getElements().add(new LineTo((i+1)*WIDTH, (j+1)*WIDTH)); 
        path.getElements().add(new LineTo(i*WIDTH, (j+1)*WIDTH)); 
        path.getElements().add(new LineTo(i*WIDTH, j*WIDTH));

        Paint currentColor =Color. rgb(255,(int) (Math.random()*255),191);

        path.setFill(currentColor);
        path.setStrokeWidth(0.1);
        return path;
    }
    public static void main(String[] args) {
        Application.launch(Path2DTestApplication.class, args);
    }
}

测试 1:按下按钮“Canvas 100 x 30”,绘制 3000 个正方形 正确快速

测试 2:按下按钮“Canvas 100 x 400”,40000 绘制了显示故障的正方形。

测试 3:按下按钮“画布” 再次 100 x 400",正确快速地绘制 40000 个正方形。

测试 4:按下按钮“路径 100 x 30”,绘制 3000 个正方形,显示 故障。

测试 5:再次按下“Paths 100 x 30”按钮,正确绘制了 3000 个正方形。

这是我向 stakoverflow 提出的第一个问题,如果我不够清楚,敬请见谅。

如果有人知道这是 jre 错误还是我的代码有问题,我将不胜感激。此外,任何解决方法都会有所帮助。 谢!!

【问题讨论】:

  • 这是完整应用程序的 github 存储库github.com/gonzalodiaz/marginmapgenerator/tree/master/…
  • 登录bug report
  • 我在配备 Retina 显示屏和 8u60 的 MacBook Pro 上没有发现任何问题。
  • 在我的设置中(与@mipa 描述的相同),我只在显示画布后按“路径”时看到问题。
  • 嗯,我认为“路径”没有任何问题,除非您的意思是小方块在这里有一个小边框,但这是设计使然,不是问题。

标签: java rendering javafx-8


【解决方案1】:

我在我的 MacBook Pro (OS X 10.9.5) 上玩过这个。它具有 2880x1800 的原生 Retina LCD 显示屏,以及 2560x1440 的附加 Thunderbolt LCD 显示屏。请注意,这两种显示器的原始像素分辨率不同。

当我运行发布的代码时,我对任何画布渲染都没有任何问题。第一次渲染“路径”选项或从“画布”切换到“路径”时,我看到了与您描述的类似的渲染问题,但前提是应用程序显示在迅雷显示器上。移至 Retina 显示屏后,一切正常。

所以问题似乎与硬件有关。这显然是一个错误,您应该按照评论中的说明报告它,但作为一种解决方法,您可以从命令行使用系统属性 -Dprism.order=sw 切换到软件渲染:

java -Dprism.order=sw gisUI.Path2DTestApplication

这消除了我系统上的所有渲染错误。您应该知道这可能会影响性能。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-27
    • 1970-01-01
    • 2015-03-28
    • 2017-10-04
    • 1970-01-01
    • 1970-01-01
    • 2018-03-30
    • 2015-10-26
    相关资源
    最近更新 更多