誰かが私のためにこれにいくつかの光を当てることができたかどうかは不思議でした。私は何年も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()
backBuffer
でfrontBuffer.DrawImageUnscaled(backBufferBitmap,0,0);
を呼び出すたびにクリアgetttingされているので
私はあなたが見つけたか、または 'game.Form.CreateGraphics();と書いたコードについて疑問を抱いています。通常、Graphicsオブジェクトをバッファリングしているような悪い考えです。 – TaW
しかし、なぜですか?私が実際にやっているのは、フォームグラフィックスオブジェクトを参照しているだけですか? –
そのようなものはありません。あなたは1つを作成しています。しかし、あなたはすべきではありません。これを行うには、「ペイント」イベントがあります! (物を測定したい、またはラバーバンドラインのような__non-persistent__グラフィックを描画したいので、他の場所を必要としない限り) - また、ビットマップを作成するときにFrontbufferに暗黙的にクリアされます。 – TaW