ループを使用して、ダブルバッファリングペインティングを呼び出しています。これは、私の唯一のPanelの再描画メソッドをオーバーライドするとともに、再描画の完全な制御をループに渡し、必要な場合にのみレンダリングするように設計されています(つまり、GUIで何らかの変更が行われました)。
これは私のレンダリングルーチンです:
Log.write("renderer painting");
setNeedsRendering(false);
Graphics g = frame.getBufferStrategy().getDrawGraphics();
g.setFont(font);
g.setColor(Color.BLACK);
g.fillRect(0, 0, window.getWidth(),window.getHeight());
if(frame != null)
window.paint(g);
g.dispose();
frame.getBufferStrategy().show();
ご覧のとおり、これはかなり標準的なものです。バッファストラテジー(2に初期化)からgrpahicsオブジェクトを取得し、それをすべて黒にして、「window」オブジェクトのpaintメソッドに渡します。
グラフィックオブジェクトを使用してウィンドウが完成したら、それを破棄し、バッファ戦略でshowを呼び出して、仮想バッファの内容を表示します。
ウィンドウがグラフィックスオブジェクトを他の多くの子コンポーネントに渡し、ウィンドウにデータを入力し、各コンポーネントがグラフィックスオブジェクトの同じインスタンスを使用して、テキスト、図形、画像などを画面に描画することに注意してください。
システムが実行され、大きな画像がレンダリングされると、問題が発生し始めます。画像はいくつかの断片にカットされ、画像がレンダリングされるはずの場所の内側に異なるオフセットで何度も(3〜4回)描画されているように見えます。私の添付画像を参照してください:
これは元の画像です: 代替テキストhttp://img109.imageshack.us/img109/8308/controller.png
これは私が得るものです: 代替テキストhttp://img258.imageshack.us/img258/3248/probv.png
2番目の画像では、画像上に図形をレンダリングしていることに注意してください。これらは常に正しい位置にあります。
なぜこれが起こっているのか考えていますか?g.drawImage(...)を呼び出す直前に、画像をメモリ内にあるようにファイルに保存すると、元の画像と同じになります。