我有一个stackPane,其中一个Pane我需要表示javafx.scene.shape.Rectangle
的矩阵2D,其中不透明度使用带有DoubleProperty的绑定每X
毫秒更新一次。问题是,即使尺寸非常小(10x15或20x30),也会出现性能不足,帧速率非常低。
我还为每个Shape使用了setCache(true)
和setCacheHint(CacheHint.SPEED)
,但没有任何变化。
这是我的代码的一部分: Cell类:
public class Cell{
private Rectangle r;
private DoubleProperty value;
Cell(final int row, final int col, final int cellSize){
r = new Rectangle(cellSize, cellSize, Color.BLACK);
r.relocate(cellSize*col, cellSize*row);
r.setCache(true);
r.setCacheHint(CacheHint.SPEED);
value = new SimpleDoubleProperty();
r.opacityProperty().bind(value);
}
public void setValue(double value){ this.value.set(value);}
public Node getNode(){return r;}
}
董事会成员:
public class Board{
private Group group;
private Cell[][] cells;
Board(final int rows, final int cols, final int cellSize){
group = new Group();
group.setCache(true);
group.setCacheHint(CacheHint.SPEED);
cells = new Cell[rows][cols];
for(int i = 0; i < rows; i++)
for(int j = 0; j < cols; j++){
cells[i][j] = new Cell(i,j,cellSize);
group.getChildren().add(cells[i][j].getNode());
}
}
public void setCellValueAt(int row, int col, double value){
cells[row][col].setValue(value);
}
Random r = new Random();
double t = 0;
public void update(){
for(int i = 0; i < cells.length; i++){
for(int j = 0; j < cells[0].length; j++){
cells[i][j].setValue(Math.abs(Math.sin((double)(j)/cells[0].length*2 + t)));
}
}
t+=0.01;
}
public Node getNode(){return group;}
}
数组中的单元格值以这种方式更新:
@Override
public void start(Stage primaryStage) {
final Board board = new Board(50, 50 , 15);
Pane pane;
try {
StackPane root = (StackPane)FXMLLoader.load(getClass().getResource("Sample.fxml"));
Scene scene = new Scene(root);
pane = new Pane(board.getNode());
pane.setPrefSize(50*15, 50*15);
root.getChildren().add(pane);
primaryStage.setScene(scene);
primaryStage.show();
} catch(Exception e) {
e.printStackTrace();
}
new Thread(()->{
while(true){
Platform.runLater(()->{board.update();});
try {
Thread.sleep(5);
} catch (InterruptedException e) { e.printStackTrace(); }
}
}).start();
}
性能非常差,即使具有高X
值(例如50/100)......在我的应用程序中,我必须处理具有低刷新率(5/10/20)的非常大的矩阵。
有什么我忘了吗?