アニメーションエンジンを作成するときに我々は画面のリフレッシュちらつきが望ましく発生することを見てきました. この効果は、画像を消去し、更新された新しいを生成するために必要な時間に起因する, アニメイトオブジェクトの結果.
これを回避する一つの手法が呼び出され DOBLEバッファO “Doublebuffered“, 私たちは、2つの画像を使用 (グラフィックスメモリ) 両方. を活かしながら、, 他のを見て、ちらつきをなくす画像間の切り替え時間を最小限に抑える.
エン コンピューティング, 複数のバッファの記憶データのブロックを保持するバッファーそれ以上の使用である, そのため、 “リーダー” あなたは、データの完全なバージョンが表示されます, 代わりにして作成されたデータの一部が更新されたバージョンの “ライター”. また、デュアルポートRAMを使用する必要性を回避するために使用され, リーダーとライターは異なるデバイスであるとき。(W)
クラスを変更 “黒板” 私たちは、組み込むように変更しました アニメーションエンジン この手法を実装する. 私たちは、保存するためにグラフィック表示に十分なメモリのサイズを知っておく必要があります, およびオブジェクトを定義する “画像” 我々はグラフを描くいるになります.
寸法D; プライベート 画像mImage = NULL;
方法 “ペイント” 画像サイズが生成する得る最初の描画. 関数呼び出し “checkOffScreenImage()” 必ずオブジェクトを処理する “mImage” 描画するかの.
このオブジェクト要求に描画するグラフィックの方向 機能付き “いるgetGraphics“. それから私は、我々は塗りつぶされた四角形要素を描画これに背景に使用色を塗りつぶします.
私たちは、描画された画像のルーチンを呼び出す, 我々は、関数で実装されています “paintOffScreen” あなたがキャンバスとして使用するためのパラメータとして、このグラフィックオブジェクトを渡す.
最後の機能は、生成されたキャンバスや、画面イメージ上に描画します.
公共同期化無効 ペイント(グラフィックG) { D =のgetSize(); checkOffScreenImage(); グラフィックoffG = mImage.getGraphics(); offG.setColor(のgetBackground()); offG.fillRect(0, 0, d.width, d.height); paintOffScreen(mImage.getGraphics()); g.drawImage(mImage, 0, 0, ゼロ); }
機能 “checkOffScreenImage()” グラフィカルな情報を表示し、描画するオブジェクトを生成するために使用されるウィンドウのサイズを変更した場合、それを監督, 関数を使用して “はcreateImage()“
プライベート空間 checkOffScreenImage() { 寸法D =のgetSize(); もし (d.width == 0 || d.height == 0) { 復帰; } もし (mImage == NULL || mImage.getWidth(ゼロ) != d.width || mImage.getHeight(ゼロ) != d.height) { mImage =はcreateImage(d.width, d.height); } }
機能 “paintOffScree” それは古い関数やメソッドです “ペイント” 私たちの描くグラフィックオブジェクト, ので、追加のコメントに値しない. 我々は、単に自分の名前を変更した.
公共空間 paintOffScreen(グラフィックG){ 列挙列挙= bd.elements(); 物体OB; 同時に(enum.hasMoreElements()){ OB = enum.nextElement(); もし(OBのinstanceof SimpleDrawable){ ((SimpleDrawable) かどうか).ペイント(G); } } }
アプリケーションを実行すると、画像のちらつきがなくなって表示されます.
でなければなりません 接続済み コメントする.