1

円をアニメーション化するプログラムは、一度に数百が描画されると滑らかに描画されません。アフィン変換を使用して形状をコピーすることが提案されました。このコードは、graphics2D を使用するようにリファクタリングされていますが、機能しますが、まだ何百もの楕円を埋めているため、パフォーマンスが向上することはありません。アフィン変換を適切に使用して形状を一度塗りつぶしてからコピー/移動する方法は?


    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        setBackground(Color.WHITE);

    for (int i = 0; i < gameLogic.getParticleArrSize(); i++) {
        Graphics2D g2 = (Graphics2D) g;
        Color color = new Color(6,6,6);
        Ellipse2D oval = new Ellipse2D.Double(
                gameLogic.getParticleXCoor(i),
                gameLogic.getParticleYCoor(i),
                gameLogic.getParticleSize(i),
                gameLogic.getParticleSize(i));
        g2.setPaint(color);
        g2.fill(oval);
        g2.translate(15, 15);
        g2.fill(oval);
  }

}

4

2 に答える 2

1

それが大きな違いを生むことは間違いありませんが、

  1. ループ内で新しい Color オブジェクトを作成する必要はありません
  2. x、y、幅、高さの値の複数の配列を保持する代わりに、Ellipse2D オブジェクトの ArrayList を保持するため、これらのオブジェクトを再作成し続ける必要もありません。

5000 個のボールを問題なく使用する例も見ました。fillOval(...) メソッドを使用します。それが違いを生むかどうかはわかりません。

于 2010-11-19T05:04:24.767 に答える
1

どちらが速いかを知る唯一の方法は、2 つ以上の実装をプロファイルすることです。具体的な例として、このキネティック モデルは、 の方法で見られるように、 を使用して、カラーモードよりも、 を使用して、グラデーションモードのわずかな利点を示しています。このコンテキストでは、より複雑なグラデーション イメージを事前にレンダリングするのに役立ちます。drawImage()fill()paintComponent()DisplayPanelAffineTransform

補遺:

楕円を移動/コピーするための適切な実装方法がわかりませんAffineTransform…</p>

AffineTransform私はそれが治療法であることを疑います。代わりに、@camickr が提案するように、オブジェクトの作成をループの外に移動します。このEnsembleでは、が 1 つしか必要としないことに注意してくださいEllipse2DsetFrame()繰り返し使用します。また、それぞれがParticleすでにそのColor. 最後に、このでペイント時間を測定する方法を観察します。

于 2010-11-19T03:08:04.383 に答える