Предотвращение обновления System.Drawing.Graphics - PullRequest
3 голосов
/ 22 ноября 2011

Я создаю движок 2D игры, который использует систему плиток.Когда он рисует эти плитки, вы можете видеть, как каждая из них рисуется отдельно на экране.Рисовать очень быстро, но вы все равно можете его видеть.

Когда я говорю графике рисовать что-то, я не хочу, чтобы она обновлялась немедленно, потому что на экране есть другие вещи для рисования, и, очевидно, это очень неэффективно.,Я хочу, чтобы он все еще «рисовал» то, что я ему говорю, но затем фактически показываю все это в одном большом обновлении ... Или это будет делать то же самое?Вероятно, в любом случае это невозможно.

//Creating graphics
public static Form GameForm; //Assigned by the form
public static Graphics GFX;

public static void Init()
{
  GFX = GameForm.CreateGraphics();
  GameForm.BackColor = Color.Black;

  // ----

  //Drawing the tiles
  while (X != 480)
  {
    while (Y != 352)
    {
      Tiles.Add(new Tile(X, Y, Num, 0));

       GFX.DrawImage(LoadedImages[4], new Point(X, Y));
       GFX.DrawRectangle(new Pen(Color.Red), X, Y, 32, 32);
       GFX.DrawString(Num.ToString(), new Font("System", 10.0F),
                                      new SolidBrush(Color.Black),
                                      new PointF((float)X, (float)Y));

        Y = Y + 32;
        Num++;
      }
      X = X + 32;
      Y = 0;
    }
    //UPDATE NOW!

1 Ответ

4 голосов
/ 22 ноября 2011

Создайте растровое изображение того же размера, что и экран. Затем вызовите Graphics.FromImage, чтобы получить Graphics экземпляр объекта, на котором вы можете рисовать. Нарисуйте все в этом объекте. Когда вы закончите, скопируйте временное растровое изображение на экран с помощью Graphics.DrawImage.

То есть:

// Create bitmap
using (var bmp = new Bitmap(form_width, form_height, GFX))
{
    using (var g = Graphics.FromImage(bmp))
    {
        // do all your drawing to g
    }

    // draw bmp to GFX
    GFX.DrawImage(bmp, 0, 0);
}
...