Проблемы с Graphics и памятью

Язык Visual Basic на платформе .NET.

Модераторы: Ramzes, Sebas

Res5
Обычный пользователь
Обычный пользователь
 
Сообщения: 72
Зарегистрирован: 07.09.2013 (Сб) 3:11

Проблемы с Graphics и памятью

Сообщение Res5 » 09.09.2014 (Вт) 14:43

Пишу интерфейс схожий с проводником ( элементы можно перетаскивать, объединять, разделять, затемнять выбранным цветом ). Отображаю их в Picturebox в событии paint. Проблема в том что при ресизе память с 8 мегабайт увеличивается до 50 мегабайт. Запускать планирую много копий причем на слабом компе, такие объемы памяти на 1но приложение недопустимы. Существует ли контролл упрощающий эту задачу (хотябы чтобы иконки перемещать можно было) или без создания кучи контроллов типа кнопки никак?

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 09.09.2014 (Вт) 14:47

Не забывай оборачивать объекты, подлежащие уничтожению в using.

Res5
Обычный пользователь
Обычный пользователь
 
Сообщения: 72
Зарегистрирован: 07.09.2013 (Сб) 3:11

Re: Проблемы с Graphics и памятью

Сообщение Res5 » 09.09.2014 (Вт) 21:28

Вот такой код у меня:
Код: Выделить всё
Private Sub Picture_Paint(sender As Object, e As PaintEventArgs)

        Dim i As Integer
        Dim X As Single
        Dim Y As Single
        Dim c As Single
        Dim bmp As New Bitmap(256, 384, System.Drawing.Imaging.PixelFormat.Format32bppArgb)


        Using g As Graphics = Graphics.FromImage(bmp)

            With g

                .DrawImage(My.Resources.Buy_sell, 0, 0)

                For i = 0 To 63

                    c = i \ 8

                    X = (i - c * 8) * 32
                    Y = c * 32

                    .DrawImage(My.Resources._0, X, Y)

                    .DrawString("9999", Font, Brushes.White,
                           X, (Y + 15))

                Next

            End With

        End Using

        Picture.Image = bmp


    End Sub


Памяти выделяется очень много, а размер 1ной картинки всеголиш 32х32 .

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 10.09.2014 (Ср) 9:03

Зачем каждый раз в Paint соззавать Bitmap? Зачем вообще Paint, если есть Bitmap?
Хотя.. Этот Paint - не обработчик события???

Res5
Обычный пользователь
Обычный пользователь
 
Сообщения: 72
Зарегистрирован: 07.09.2013 (Сб) 3:11

Re: Проблемы с Graphics и памятью

Сообщение Res5 » 10.09.2014 (Ср) 13:18

Обработчик. Без обработчика paint не обойтись, т.к. итемы перемещаются и их нужно отрисовывать. Если рисовать непосредственно на picture и не пользоваться using ситуация таже. Пока пользуюсь кучей пикчеров и лабелов внутри них, видимо класс Graphics не годится для таких целей, ну а исспользовать directx нецелесобразно.

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 10.09.2014 (Ср) 20:33

Res5 писал(а):Обработчик.

Расовать на bitmap'е в обработчике paint - это всё равно что менять стекло каждый раз, когда открываешь занавески :)

Res5 писал(а):Без обработчика paint не обойтись

Неверно.

Res5 писал(а):Проблема в том что при ресизе память с 8 мегабайт увеличивается до 50 мегабайт. Запускать планирую много копий причем на слабом компе

Так запусти на нём и посмотри. Если код нормальный, то .NET скорее всего сам разберётся с памятью.


Вернуться в Visual Basic .NET

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 38

    TopList