TransWikia.com

Оптимизация отрисовки на форме .NET

Stack Overflow на русском Asked on February 27, 2021

Пытаюсь написать простую 2D игру. Вот что уже сделано:

public interface GameObject
{
    Bitmap Picture  { get; }
    int OffsetX     { get; }
    int OffsetY     { get; }
}

Свойство Picture возвращает картинку для отрисовки текущего объекта.

public static class Game
{
    public class MapIndexer
    {
        public GameObject this[int x, int y]
        {
            get => map[y, x];
            set => map[y, x] = value;
        }
    }

    private static MapIndexer indexer;
    public static MapIndexer Map
    {
        get => indexer ?? (indexer = new MapIndexer());
    }

    static GameObject[,] map = new GameObject[,]
    {
        { null, null, null },
        { null, null, null },
        { null, null, null }
    };

    public static int MapWidth
    {
        get => map.GetLength(1);
    }
    public static int MapHeight
    {
        get => map.GetLength(0);
    }
}

Класс игры, здесь индексатор для обращения к карте в Декартовой системе (например ход вниз – Game.Map[x, y+1], иначе ход вниз это Game.Map[x+1, y]). Нули в массиве это филлер карты, в моем случае просто трава. Также создал простой класс Player который возвращает свою картинку.

private void Form1_Paint(object sender, PaintEventArgs e)
{
    for (int y = 0; y < Game.MapHeight; y++)
        for (int x = 0; x < Game.MapWidth; x++)
        {
            e.Graphics.DrawImage(Properties.Resources.Grass, new Point(x * size, y * size));
            if (Game.Map[x, y] is not null)
                e.Graphics.DrawImage(Game.Map[x, y].Picture, new Point(x * size + Game.Map[x, y].OffsetX, y * size + Game.Map[x, y].OffsetY));
        }
}

Сам код отрисовки. Выглядит для меня странно, что и подтверждается его работой – при отрисовке анимации с периодом 200мс картинга "моргает". Собственно вопрос – как оптимизировать всю эту отрисовку?

One Answer

Судя по названию методов в вашем коде вы отрисовываете вашу картинку сразу на форму. Поэтому для формы установить флаг DoubleBuffered в значение true. Это должно решить проблему. Но а в целом я бы порекомендовал почитать статьи про двойную буферизацию.

Correct answer by AvtPhenix on February 27, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP