Как уменьшить объем памяти, используемой последовательной Graphics.DrawImage () - PullRequest
0 голосов
/ 31 марта 2020

Я работаю над созданием приложения, которое отображает одно из трех изображений в списке images в графическом окне каждые 3 секунды, и я сделал это путем загрузки одного из изображений непосредственно в графическое окно с помощью

drawing.Image = Image.FromFile(images[1]);

Затем я использовал класс Graphics для рисования двух других изображений.

void PictureBox_Paint_alarm(object sender, PaintEventArgs e)
        {
            if (rotationCounter > images.Count-1)
                rotationCounter = 0;
            if (rotationCounter != 1)
                e.Graphics.DrawImage(Image.FromFile(images[rotationCounter]), new RectangleF(0, 0, drawing.Size.Width, drawing.Size.Height));
        }

rotationCounter увеличивается на 1 каждые 3 секунды и функция приложения соответствует назначению. Однако я заметил, что программа с течением времени потребляет больше памяти, пока она не достигнет 5 гигабайт, а затем вернется к 400 КБ, средний размер изображений - 450 КБ.

Проблема в том, что я собираюсь развернуть эту программу в системе, которая имеет только 2 ГБ ОЗУ

Ответы [ 2 ]

1 голос
/ 31 марта 2020

У вас есть массив images (или что-то очень похожее), в котором хранятся имена файлов. Вместо этого загрузите изображения один раз и получите массив этих вместо имен файлов. Таким образом, вы не будете постоянно перезагружать изображения из файла.

Это также означает, что вы не продолжаете создавать очень (ресурсные) дорогие Image объекты. Эти вещи реализуют IDisposable и поэтому предназначены для утилизации, когда они больше не нужны. Вместо этого вы просто позволяете им сидеть без дела, пока они не соберут мусор:

, пока он не достигнет 5 гигабайт, затем он возвращается к 400 КБ, средний размер изображений составляет 450 КБ.

Это именно то, что вы здесь описываете.

Проблема в том, что я собираюсь развернуть эту программу в системе, которая имеет только 2 ГБ ОЗУ

И это не будет проблемой, потому что а) программы не выделяют физическую память и б) сборщик мусора запускается раньше, когда в памяти возникает давление.

0 голосов
/ 31 марта 2020

Вы можете использовать G C .Collect (); использовать сборщик мусора.

Также, если вы объявили объекты, вы можете использовать DeleteObject (), чтобы удалить их после использования.

Эта ссылка может быть полезна: Удаление и выпуск объектов GDI

...