System.OutOfMemoryException: недостаточно памяти - PullRequest
0 голосов
/ 27 апреля 2019

Я делаю игру, которая использует графику для рисования случайных картинок из папки. Вот оно:

Это для игры на C #

public static int cookiecount;
public static Random random = new Random();
public static string[] files = Directory.GetFiles(Application.StartupPath, "*.png");
public static Image im;

public static void Draw(System.Drawing.Graphics g, int x, int y)
{
    try
    {
        im = Image.FromFile(files[random.Next(0, files.Count())]);

        g.DrawImage(im, x, y, 40, 40);
    }
    catch(Exception ee) {
        MessageBox.Show("Error! " +ee.Message + " " + ee.Source + " " + ee.HelpLink,
            "Oh No", MessageBoxButtons.OK, MessageBoxIcon.Error);
    }

    cookiecount++;
}

Выводит ошибку, которая гласит:

System.OutOfMemoryException: недостаточно памяти

1 Ответ

1 голос
/ 27 апреля 2019

Как уже говорили другие, у вас утечка памяти, так как вы не утилизируете изображения.Примечание: обычно память неиспользуемых объектов автоматически освобождается в C #, но изображения являются особыми, так как они являются COM-объектами, то есть не .NET-объектами.

Вместо загрузки изображений снова и снова, загрузите их один раз.Поскольку одни и те же изображения используются на протяжении всей игры, вам не нужно их утилизировать.

public static int cookiecount;
public static Random random = new Random();
public static Image[] images;

// Call this once at program start.
public static LoadImages()
{
    string[] files = Directory.GetFiles(Application.StartupPath, "*.png");
    images = new Image[files.Length];
    for (int i = 0; i < files.Length; i++) {
        images[i] = Image.FromFile(files[i]);
    }
}

public static void Draw(System.Drawing.Graphics g, int x, int y)
{
    int index = random.Next(0, images.Length);
    g.DrawImage(images[index], x, y, 40, 40);

    cookiecount++;
}

Для массивов используйте свойство Length вместо вызова метода расширения Count().Это более эффективно.

Кроме того, обработка исключений должна быть перемещена в LoadImages().Ради простоты я не показывал это здесь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...