2009-07-08 3 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

мой вопрос о доступе к пикселам, а не об очистке экрана. (вопрос редактирования) – 2009-07-08 01:22:06

+1

Код не очищает экран, он устанавливает каждый пиксель в объекте Bitmap указанному цвету. Точно так же, как то, что делает ваш код, только намного быстрее. – Guffa

0

SetPixel/GetPixel, как правило, медленные операции. Если вы можете использовать небезопасный код (код, который использует указатели), есть более быстрые методы доступа, но они немного более активно участвуют. Существует учебник здесь, который объясняет, как это работает, однако:

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

Смежные вопросы