Java: 常に変化するグラフィックスを描画する方法
常に変化するグラフィックスを描画することは、特にパフォーマンスの問題に対処したり最適化する場合に困難な作業になることがあります。レンダリングプロセス。この記事では、カスタム グラフィックス エンジンのパフォーマンスを向上させるためのテクニックと変更を検討します。例として、現在のマウス位置の周囲 64 ピクセルがフォーム上で拡大されて描画されるシナリオを示します。
元のコードは影響を受けます。ピクセルの色の取得とレンダリングの非効率性による潜在的な速度低下から解放されます。これらの課題に対処するための一連の最適化を見てみましょう:
ピクセル カラー取得の最適化
ピクセル カラーを 1 つずつ取得する代わりに、robot.createScreenCapture( ...) 1 回の操作で 64 ピクセルすべてをフェッチします。これにより、複数の個別の色の取得のオーバーヘッドが排除されます。
スマート クリッピングの導入
不必要な再描画を避けるために、「スマート クリッピング」を実装しました。前回の更新以降に変更されたピクセルを検出することで、再描画領域を影響を受ける領域のみに制限できます。これにより、必要な再描画の量が大幅に削減されます。
スレッドの強化
すべてのモデルの更新とビューの再描画がイベント ディスパッチ スレッド (EDT) で行われるようにしました。これにより、競合状態のない一貫した応答性の高い対話が保証されます。
結果
これらの最適化を実装した後、アプリケーションは人間の目には瞬時に更新されるようになり、289 回の画面更新には 1 時間かかります。累積時間はわずか 1 秒です。
コード機能強化
再描画メソッドの修正
再描画メソッドは、必要な領域のみを再描画するようになりました。
repaint(40 + x * STEP, 45 + y * STEP, 40 + (x * STEP) - 3, 45 + (y * STEP) - 3);
ティッカー スレッド
テロップスレッドを効率的に実行ピクセルの色の変化を検出し、それに応じてモデルを更新します。
.... final BufferedImage capture = robot.createScreenCapture(rect); for (int x = 0; x < 8; x++) { for (int y = 0; y < 8; y++) { final Color pixelColor = new Color(capture.getRGB(x, y)); if (!pixelColor.equals(view.getColorAt(x, y))) { final int finalX = x; final int finalY = y; SwingUtilities.invokeLater(new Runnable() { public void run() { view.setColorAt(finalX, finalY, pixelColor); } }); } } }
これらの最適化とテクニックを組み込むことで、カスタム グラフィックス エンジンを大幅に強化し、要求の厳しいシナリオでも、絶えず変化するグラフィックスを簡単に処理できます。
以上がJava グラフィックスのパフォーマンス: 絶えず変化するピクセルの描画を最適化するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。