red*_*-ar 6 java rendering javafx-8
我有一个javaFX 8应用程序在jre 1.8.0_45中运行得非常好但是今天有一个用户来找我有问题.经过一番调查后,我意识到这与他最近发布的jre有关,特别是1.8.0_60.我正在阅读一个GIS shapefile并在我的版本中绘制几个路径到一个组(如30.000或更多)它有点慢,但它工作正常.在最新版本中,图像显得扭曲.以块的形式抽出不合适的路径.
所以我决定做一个小测试应用程序来将问题与我可能正在做的任何事情分开.在这样做时,我发现问题不仅在绘制路径组时,而且绘制到画布时.此外,如果我设法重绘屏幕,图像看起来会很好.例如,我有一个带有包含路径的Group的visible属性的复选框,所以如果我将它设置为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);
}
}
Run Code Online (Sandbox Code Playgroud)
测试1:按下"画布100 x 30"按钮,正确快速绘制3000个正方形
测试2:按下"Canvas 100 x 400"按钮,绘制40000个正方形,显示毛刺.
测试3:再次按下"画布100 x 400"按钮,正确且快速地绘制40000个方格.
测试4:按下"路径100×30"按钮,绘制3000个正方形,显示毛刺.
测试5:再次按下"路径100 x 30"按钮,正确绘制3000个方格.
这是我对stakoverflow的第一个问题,如果我不够清楚就道歉.
如果有人知道这是一个jre错误或我的代码有问题,我将不胜感激.任何变通办法都会有所帮助.韩国社交协会!
我在 MacBook Pro (OS X 10.9.5) 上尝试过这个。它具有 2880x1800 的原生 Retina LCD 显示屏,以及 2560x1440 的附加 Thunderbolt LCD 显示屏。请注意,这两种显示器的原始像素分辨率不同。
当我运行发布的代码时,我没有遇到任何画布渲染问题。当第一次渲染“路径”选项,或从“画布”切换到“路径”时,我看到了与您描述的类似的渲染问题,但前提是应用程序显示在雷电显示器上。当转移到视网膜显示屏时,一切工作正常。
所以问题似乎与硬件有关。-Dprism.order=sw
这显然是一个错误,您应该按照评论中提到的方式报告它,但作为解决方法,您可以使用命令行中的系统属性切换到软件渲染:
java -Dprism.order=sw gisUI.Path2DTestApplication
Run Code Online (Sandbox Code Playgroud)
这消除了我系统上的所有渲染错误。您应该意识到这可能会影响性能。