2016-11-25 15 views
1

誰かが私のためにこれにいくつかの光を当てることができたかどうかは不思議でした。私は何年もC#をコーディングしてきましたが、ビットマップクラス以外のSystem.Drawing名前空間には何も触れていませんでした。私はいくつかのチュートリアルを続け、いくつかのコードを思いついた。私は2D Game Engineを開発しています。下のコードは、GDIを使用するグラフィックエンジン用のコードです。しかし、私はこのコードがどのように働いているのか分かりません。ここにあります:このコードはどのように機能しますか? (GDI、C#)

private Graphics frontBuffer; 
    private Graphics backBuffer; 
    private Bitmap backBufferBitmap; 

    public void Initialize() 
    { 
     backBufferBitmap = new Bitmap(game.Form.Width, game.Form.Height); 
     frontBuffer = game.Form.CreateGraphics(); 
     backBuffer = Graphics.FromImage(backBufferBitmap);   
    } 

    public void Update() 
    { 
     try 
     { 
     frontBuffer.DrawImageUnscaled(backBufferBitmap,0,0); 
     backBuffer.Clear(Color.Black); 
     } 
     catch(Exception e) 
     { 
     throw e; 
     } 
    } 

私にとって紛らわしい主な部分はこれです。

バックバッファのビットマップはどのように更新されていますか?なぜバックバッファがクリアされ、フロントバッファはクリアされていないのでしょうか?

また、initializeメソッドは1回呼び出され、更新メソッドはwhileループでフレームごとに1回呼び出されます。あなたはまた、backBuffer.Clear(Color.Black);

を呼び出しているので、あなたがupdate()

backBufferfrontBuffer.DrawImageUnscaled(backBufferBitmap,0,0);を呼び出すたびにクリアgetttingされているので

+1

私はあなたが見つけたか、または 'game.Form.CreateGraphics();と書いたコードについて疑問を抱いています。通常、Graphicsオブジェクトをバッファリングしているような悪い考えです。 – TaW

+0

しかし、なぜですか?私が実際にやっているのは、フォームグラフィックスオブジェクトを参照しているだけですか? –

+0

そのようなものはありません。あなたは1つを作成しています。しかし、あなたはすべきではありません。これを行うには、「ペイント」イベントがあります! (物を測定したい、またはラバーバンドラインのような__non-persistent__グラフィックを描画したいので、他の場所を必要としない限り) - また、ビットマップを作成するときにFrontbufferに暗黙的にクリアされます。 – TaW

答えて

1

ビットマップからbackBufferグラフィックスオブジェクトを初期化した後は、たとえばbackBuffer.DrawLine(...)などと言うたびに、GDI +はこのビットマップ上で直接ピクセル操作を行います。彼らは方法でリンクされています。キャンバスにはbackBufferBitmap、ブラシにはbackBufferと考えてください。

frontBufferは、代わりにフォームから初期化されます。したがって、フォームはキャンバスで、frontBufferで行うことはフォームに描画されます。この場合はbackBufferBitmapが描画されます。

これは基本的にダブルバッファリング方式で、ラインとサークルをフォームに直接描画することよりも多くの利点があります。少ないちらつき。フォームに何かを描画するときは、そのフォームが非常に頻繁に削除されることを覚えておいてください(たとえば、フォームを画面領域外に移動した場合など)。フォームのPaintイベントを使用してリフレッシュする必要があります。 Update()

は再度更新を呼び出す前に、それが画面に描画された後、ビットマップはあなたのClear()で黒く塗りつぶされているので、あなたは、backBufferにあなたのシーンを再描画する必要があるだろう、と呼ばれています。

+0

ありがとうございます!それは非常に有益でした。私が混乱した主な理由は、私がバックバッファを初期化した後、私がビットマップに具体的に描画するかどうか分からなかったということです。これをクリアしていただきありがとうございます。私には何が起きているのかが感じられましたが、わかりませんでした。私はペイントイベントを使用していないので、代わりに各フレームでApplication.DoEventsを呼び出すことで自分のメソッドを使用しています。どうもありがとうございました! –

+0

あなたはこの回答に満足しているようです@ MathewO'Dwyer?もしそうなら、それを受け入れたものとしてマークして、他の人が同じエリアでヘルプを探していても、またジェンスに信用を与えるならば、すぐに正しい答えを見つけることができます。 – MrApnea

+0

@FSダニエル大丈夫、初めてこれは申し訳ありません:)。 –

0

frontBufferが更新取得され、initialize()は一度だけ呼ばれるようになっています。オブジェクト作成時。そして、私はそれが親が子どものupdate()と呼んでいる大きなプログラムの一部だと信じています。

+0

あなたはそれが疑わしいと確信していますか? – Prajwal

+0

お返事ありがとうございます。しかし、InitializeとUpdateは私が作成した独自のメソッドです。私が理解していないのは、ビットマップの更新方法です。 –

+0

また、なぜ私は、frontBuffer.clearの代わりにbackBuffer.clearを呼び出すのですか?なぜ私はそれをしなければならないのですか? –

関連する問題