この質問が基本的であれば、私は主にC#の知識を持っていますが、この特定のプロジェクトでJavaを使用することを余儀なくされています。Occupancy GridをJava Swingで効率的にレンダリング
ロボットセンサーデータに基づいてoccupancy gridを表示するGUIを実装しようとしています。占有グリッドはかなり大きく、恐らく最大1500×1500のグリッド・スクエアが、グリッド・セルあたり約10cm2の実世界面積を表します。
単に例えば、可算状態を保存します。各グリッドの正方形:
- 不明
- 空い
- 占領
- ロボットが
私は単に最良を見つけるしたいと思います異なる色の四角形を使用して異なるグリッドセルの状態を表現する、グリッドとしてレンダリングする方法
私は、正方形とグリッド線を描画するための素朴で基本的なアルゴリズムを実装しましたが、大きな占有グリッドでは非常に悪い結果を出します。クラス内の他のコードは、新しいセンサーデータが収集されるたびに0.5秒ごとにウィンドウを再描画しますが、パフォーマンスが非常に悪い理由は、毎年すべてのセルをレンダリングしているということです。観察可能なクラスで各セルをラップすると、これらのセルを選択的にレンダリングする簡単な方法はありますか?
私の現在の実装:
@Override
public void paint(Graphics g) {
Graphics2D g2 = (Graphics2D) g;
int width = getSize().width;
int height = getSize().height;
int rowHeight = height/(rows);
int colWidth = width/(columns);
//Draw Squares
for (int row = 0; row < rows; row++) {
for (int col = 0; col < columns; col++) {
switch (this.grid[row][col]) {
case Unexplored:
g.setColor(Color.LIGHT_GRAY);
break;
case Empty:
g.setColor(Color.WHITE);
break;
case Occupied:
g.setColor(Color.BLACK);
break;
case Robot:
g.setColor(Color.RED);
break;
}
g.drawRect(col * colWidth, height - ((row + 1) * rowHeight), colWidth, rowHeight);
g.fillRect(col * colWidth, height - ((row + 1) * rowHeight), colWidth, rowHeight);
}
}
int k;
if (outline) {
g.setColor(Color.black);
for (k = 0; k < rows; k++) {
g.drawLine(0, k * rowHeight, width, k * rowHeight);
}
for (k = 0; k < columns; k++) {
g.drawLine(k * colWidth, 0, k * colWidth, height);
}
}
}
private void setRefresh() {
Action updateUI = new AbstractAction() {
boolean shouldDraw = false;
public void actionPerformed(ActionEvent e) {
repaint();
}
};
new Timer(updateRate, updateUI).start();
}
助けてください!前もって感謝します。
それは、この場合に特に有用ではないのですが、「Swingのプログラムは、オーバーライドする必要があります'paint()'をオーバーライドするのではなく 'paintComponent()'を使用します。 " - [AWTとスイングのペイント:ペイントメソッド](http://java.sun.com/products/jfc/tsc/articles/painting/index。 html#コールバック)。 – trashgod
@Andrew Thompsonこの声明はJava開発者を尊敬することを意図したものではなく、私の知識の不足について説明するためのものです。私はそれが特に「不自然な」コメントではないと思います。結局のところ、私はあなたが何か解決策を研究していなかったという印象を得るのが好きではありません。 –