Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Мультимедиа в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.06.2012, 16:10   #1
Orchestroman
Пользователь
 
Регистрация: 21.07.2010
Сообщений: 22
По умолчанию Утечка памяти [png;bmp;буффер]

День добрый;
Реализую графический буфер с использованием png (очень экономит память, в отличие от bitmap).
Как минимум уже на этапе объявления есть 3 лишних метра
Код:
Buffer: array[0..19] of tpngobject; 
при попытке создания динамического массива из элементов:
///
 t3.Width:=form2.Width;
      t3.Height:=form2.Height;
      t3.TransparentColor:=form2.TransparentColorValue;
      t3.Transparent:=true;
         t3.Canvas.CopyRect(form2.ClientRect,form2.Canvas,form2.ClientRect);

       buffer[индекс].Assign(t3);
       buffer[индекс].SaveToFile(адрес для проверки размера(около 8кб));
       FreeAndNil(t3);
///
В интернетах читал что-то типа про assign, что он касячит с памятью. но хз
Может имеет смысл не держать в оперативке все элементы буфера(у меня их штук 20 скажем), а писать в файл и непосредственно обращаться к нему каждый раз. Как сильно уменьшится скорость? заносить данные в буфер потребуется не редко... Заранее спасибо

Последний раз редактировалось Stilet; 03.06.2012 в 16:35.
Orchestroman вне форума Ответить с цитированием
Старый 03.06.2012, 16:59   #2
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

В лучшем случае (когда ОС) кэширует Ваш файл - немного. Иначе, если файл открыт - 10-30 мс, нужно открывать - 30-100 мс. Плюс сами 3 Мб будут читаться 20-100 мс.
Но ради 3 Мбайт я бы не стал прибегать к файловым операциям.
s-andriano вне форума Ответить с цитированием
Старый 03.06.2012, 17:09   #3
Orchestroman
Пользователь
 
Регистрация: 21.07.2010
Сообщений: 22
По умолчанию

3 мегабайта только при включении. после 30-40 шаког прога кушает в районе 100 метров
Сейчас реализовал с файлами, все таки продолжительное время он рабит... заметно
Orchestroman вне форума Ответить с цитированием
Старый 03.06.2012, 17:38   #4
Orchestroman
Пользователь
 
Регистрация: 21.07.2010
Сообщений: 22
По умолчанию

если загонять в массив и держать в опере, то каждый файл весит скажем 10 кб. т.е. при 20 элементах 200кб. А судя по занимаемому месту в опере, каждая весит в районе 2-3 метров. т.е. столько же, сколько и битмап. но битмап я чищу разумеется. Вот когда png.Assign(bitmap); может ли происходить потеря памяти?
Orchestroman вне форума Ответить с цитированием
Старый 03.06.2012, 19:06   #5
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Утечка памяти - следствие ошибки в алгоритме, и перенесение части данных из ОП на диск эту ошибку не устранит.
s-andriano вне форума Ответить с цитированием
Старый 04.06.2012, 10:53   #6
x128
Форумчанин
 
Регистрация: 03.02.2010
Сообщений: 178
По умолчанию

Цитата:
Сообщение от Orchestroman Посмотреть сообщение
Реализую графический буфер с использованием png (очень экономит память, в отличие от bitmap).
Это с какого перепуга будет экономиться память? При сохранении на диск, да, действительно, PNG будет компактнее битмапа за счет сжатия, но в памяти... В памяти будет тот же битмап + весь обвес для PNG, в данном случае, обычный битмап будет меньше памяти нанимать. Если уж сильно нужно держать в памяти буфер с сжатыми изображениями, в таком случае нужно использовать TMemoryStream. Скорость конечно просядет т.к. нужно будет сжимать изображение при записи в буфер и разжимать при чтении/выводе, но если этого требует ограничение на используемую оперативную память, придется чем-то жертвовать.
Код:
Buffer: array[0..19] of TMemoryStream; 
...
t3.SaveToStream(buffer[индекс]);
как-то так.
x128 вне форума Ответить с цитированием
Старый 04.06.2012, 12:55   #7
Orchestroman
Пользователь
 
Регистрация: 21.07.2010
Сообщений: 22
По умолчанию

спасибо большое!) буду пробовать
Orchestroman вне форума Ответить с цитированием
Старый 04.06.2012, 13:38   #8
Orchestroman
Пользователь
 
Регистрация: 21.07.2010
Сообщений: 22
По умолчанию

Заодно спрошу (пока ищу в гугле..)
Код:
buf:=TBitmap.Create;  //
buf.Width:=form2.Width;
buf.Height:=form2.Height;
buf.Canvas.CopyRect(form2.ClientRect,form2.Canvas,form2.ClientRect);
pn:=tpngobject.Create; 
pn.Assign(buf);   //
buffer[1]:= TMemoryStream.Create;
pn.SaveToStream(buffer[1]);
buf.Free;
pn.Free;
Как считать потом определенный элемент...
buffer[индекс].read(pn,sizeof(pn)); // разумеется ругается, ибо неизвестен развем pn и не хватает понимания, как это работает..
Orchestroman вне форума Ответить с цитированием
Старый 04.06.2012, 13:44   #9
Orchestroman
Пользователь
 
Регистрация: 21.07.2010
Сообщений: 22
По умолчанию

Разобрался)
Код:
   pn:=tpngobject.Create;
   buffer[bufferindex[2]].Position:=0;
   pn.LoadFromStream(buffer[bufferindex[2]]);
Всем спасибо!
Orchestroman вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
утечка памяти Кудаив Помощь студентам 1 30.04.2012 18:18
Утечка памяти forivanb Общие вопросы Delphi 4 11.04.2012 15:28
Утечка памяти Juffin Общие вопросы Delphi 3 02.11.2010 12:11
Утечка памяти ZvEr_HaCkEr Свободное общение 13 24.09.2010 19:30
утечка памяти в С++ vengo Общие вопросы C/C++ 9 10.06.2008 21:24