私は自分の Mac で Java アプリケーションを開発しています。ロジックは次のとおりです。
- サーバーがクライアント アプリケーションに、基本的な形状を描画するためのいくつかの命令を送信します。
- クライアント アプリケーションは、基本的な形状を Jpanel に描画します。
Shape が到着するたびに、プログラムは repaint() を呼び出します。
public void paintShape(Shape p)
{
//this.paintComponent(this.getGraphics());
arrayofShapes.add(p);
this.repaint();
//this.updateUI();
//this.update(this.getGraphics());
}
public void paintComponent(Graphics g)
{
super.paintComponent(g);
g2d = (Graphics2D) g.create();
g2d.setStroke(new BasicStroke(2));
g2d.setColor(pickedColor);
for(final Shape p : arrayofShapes)
{
g2d.draw(p);
}
//g2d.dispose();
}
すべてがスムーズに (リアルタイムで) 動作するので、同じアプリケーションを Windows コンピューターでテストすることにしました。その結果、アプリケーションが遅延します。以上が私がたどり着いた結論です。
- RepaintManager は repaint() 呼び出しを蓄積しています。形状が目的地に到着する様子はわかりますが、場合によっては 5 回以上の再描画呼び出しが 1 つに蓄積され、アプリケーションが非常に遅れたり、リアルタイムではなくなります。
形状が到着するたびに再描画を呼び出す代わりに、タイマーで数ミリ秒ごとに再描画を試みましたが、結果は同じです。コード :
ActionListener listener = new ActionListener(){
public void actionPerformed(ActionEvent event){
repaint();
}
};
Timer displayTimer = new Timer(5, listener);
displayTimer.start();
さらに、マウスでペイントできるランダムなコードをいくつかテストしました。これは、paintComponent を使用したロジックと同じです。この場合、ラグ感なくスムーズに動作します....例: http://javagraphics.blogspot.com.es/2010/06/shapes-implementing-freehand-pencil.html
私の Windows コンピュータ (同じ Jar) で paintComponent が非常に遅い理由がわかりません。プログラムのパフォーマンスに影響を与える可能性のあるものは何ですか?
ペイント コンポーネントに関するすべての回答を読みましたが、いずれもこの問題を解決しました。
問題を解決し、実際にリアルタイムでアーカイブする方法について何かアドバイスはありますか?
前もって感謝します
ビデオの更新:
Mac ビデオ: https://youtu.be/OhNXdGXoQpkリアルタイム 高負荷を処理しても問題ありません
Windows ビデオhttps://youtu.be/yol2miHudZc明らかにラグ
低クオリティで申し訳ありません
BufferedImage を更新します。
BufferedImage を導入した後も、結果はまだ遅い描画アプリケーションです。注文の1つはすべての形状を削除することであるため、別の問題が発生します。次のことを行う必要があるため、複雑さが増します。
g2d.clearRect(0, 0, screenSize.width, screenSize.height);
HW/OS/Javaバージョン
ウィンドウズ
- プロセッサー i5-4300u 2.5GHz
- ラム12GB
- Java バージョン 1.7.0_71
マック
- プロセッサー i7 2.9GHz
- ラム8GB
- Java バージョン 1.7.0_67
Java VisualVM
ライブ VisualVM のビデオ: https://youtu.be/cRNX4b3rlZk
ラグが発生する理由を説明できる奇妙なことは何も見当たりませんが、私は専門家ではありません(これも低品質で申し訳ありません)
ご回答ありがとうございました