2009-07-08 12 views
0

これをより効率的に描くにはどうすればよいですか?どのように私はより効率的に描画するのですか?

私は以下のコードを呼び出すと、遅れを感じることができます。注:これは、ピクセルの編集に関するもので、画面をクリアしないものです。

int colorIndex = 0; 
    private void pictureBox1_Click(object sender, EventArgs e) 
    { 
     if (colorIndex == 0) 
      draw(Color.DimGray); 
     else if(colorIndex ==1) 
      draw(Color.ForestGreen); 
     colorIndex++; 
     colorIndex = colorIndex % 2; 

     pictureBox1.Invalidate(); 
     //pictureBox1.Update(); 
    } 

    void draw(Color c) 
    { 
     //var bdata = b.LockBits(Rectangle.Empty, System.Drawing.Imaging.ImageLockMode.WriteOnly, System.Drawing.Imaging.PixelFormat.Format32bppArgb); 
     //var px = bdata.Scan0; 
     var px = b; 
     { 
      for (int y = 0; y < b.Height; y++) 
      { 
       for (int x = 0; x < b.Width; x++) 
        //px[y * b.Width + x] = -1; 
        px.SetPixel(x, y, c); 
      } 
     } 
     //b.UnlockBits(bdata); 
    } 

答えて

1

方法について:

void draw(Color c) { 
    using (Graphics g = Graphics.FromImage(b)) { 
     g.Clear(c); 
    } 
} 
+0

私の質問は、ピクセルアクセスについてであり、画面をクリアすることではありません。 –

+1

コードは画面をクリアしていないので、Bitmapオブジェクトのすべてのピクセルを指定した色に設定しています。あなたのコードが行っていることとまったく同じですが、ずっと速いです。 – Guffa

0

とsetPixel/getPixelと、一般的に遅い操作です。安全でないコード(ポインタを使用するコード)を使用できる場合は、より高速なアクセス方法がありますが、それらはやや複雑です。それがどのように動作するかを説明し、ここでチュートリアルは、しかし、があります。

http://www.codeproject.com/KB/GDI-plus/csharpgraphicfilters11.aspx

3

あなたがdouble bufferingを有効にすることがありますか?

btw矩形を描画するだけの場合は、DrawRectangleメソッドを使用できます。

関連する問題