スイングJPanelにアニメーションを描いています。1024x1024 の画面は 2000 個の部分に分割され、画面を正確にカバーします (オーバーラップはありません)。
各部分は画面の非常に小さな部分です (2000 分の 1)。アニメーションは、バッファリングされた画像のピクセルを変更し、reaint() を呼び出すことで、ミリ秒ごとに 1 つのピースを描画します。そのため、画面全体が 2 秒ごとに変化します。アニメーションは java.util.Timer タスクで実行されます。
バッファリングされたイメージは高速化されておらず、揮発性でもありません。優先度を1に設定しました。
フレーム ルート ペインが最適化されます。フロント バッファーとバック バッファーの両方が高速化されますが、揮発性ではありません。
これは正常に動作します。
プロファイリングによると、ほとんどすべてのグラフィックス時間は、予想どおりバッファリングされた画像の描画に費やされています。ダーティな四角形を使用しても、描画時間の短縮には役立たないようです。
バッファリングされた画像の描画を正確な形状でクリップすると、その部分がペイントされ、画面の残りの部分が白くなります。
私がしたいのは、画面の残りの部分をそのままにして、切り取られた形状をペイントすることです。
各ピースのピクセルを作成するには、10 個のレイヤーをブレンドする必要があるため、そこでいくつかの計算が行われます。awt タイマー スレッドでこれをより適切に行うことができますか?
または、キャンバスと更新トリックhttp://java.sun.com/products/jfc/tsc/articles/painting/src/UpdateDemo.javaを使用する必要があります
Toolkit.getDefaultToolkit().setDynamicLayout(true); を含む提案を見ました。System.setProperty("sun.awt.noerasebackground","true");
その他の提案としては、すぐにペイントする、JPanel の代わりに JComponent をサブクラス化するなどがあります。
これはすべてややこしいと思います。
この OS にできるだけ依存しないようにしたいのですが、アプリは主に Windows 7 で動作します。
ここで私が取るべき次の (小さな) 論理的なステップは何ですか?
更新: キャンバスを (更新トリックなしで) 使用すると、バッファリングされた画像の描画にかかる時間が大幅に短縮されました。これがプロファイラーの一番上の行にある代わりに、私はそれを見つけることができません! パネルを使用するとき、必要以上のことをしている可能性があります。