Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 23.01.2012, 18:22
Snake22 Snake22 вне форума
Активный
 
Регистрация: 20.02.2011
Сообщения: 374
Репутация: 744
По умолчанию быстро освободить массив с >1000 изображениями

подскажите пожалуйста есть ли способ быстро освободить массив image с более тысячи иконками?
после освобождения надо заново загружать туда другие.
делаю так
for i:=length(ims)-1 downto 0 do
ims[i].free;
setlength(ims,0);
но когда их много то довольно таки долго эта операция происходит....
Ответить с цитированием
  #2  
Старый 25.01.2012, 16:22
Аватар для DelphiM0ZG
DelphiM0ZG DelphiM0ZG вне форума
Новичок
 
Регистрация: 22.10.2011
Сообщения: 62
Репутация: 666
По умолчанию

Быстрого способа не знаю, но можно попытаться немного выиграть в скорости, если использовать не динамический, а обычный массив с большим количеством элементов.

Ещё я от препода слышал, что цикл For...DownTo...Do работает медленнее, чем For...To...Do (не знаю насколько это правда), но в этом случае придётся для скорости сделать как-то так:
Код:
N:=length(ims)-1;
for i:=0 to N do
  ims[i].free;
setlength(ims,0);
__________________
Чем больше знаешь, тем сильнее осознаёшь, что знаешь гораздо меньше, чем не знаешь!..
Ответить с цитированием
  #3  
Старый 25.01.2012, 16:37
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Цикл "вверх" (to) врятли работает быстрее, потому что в некоторых случаях делфи "переворачивает" обычные циклы в целях оптимизации (были темы на форуме). Да и в машинном коде цикл "вниз" организуется меньшим числом команд, есть даже команда loop специально для этого.
Для цикла "вверх" нужно на каждом проходе увеличивать i и сравнивать с результатом. А вот для цикла "вниз до нуля" достаточно только уменьшать - когда i станет равно нулю, автоматически выставится флаг нуля, в данном случае сигнализирующий об окончании цикла.
Более быстрого способа не вижу.
Можно попробовать сделать несколько больших картинок (как бы ленты из иконок) и, в зависимости от ситуации, копировать и отрисовать нужный участок. Тогда освобождение будет быстрее.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.

Последний раз редактировалось Bargest, 25.01.2012 в 16:42.
Ответить с цитированием
  #4  
Старый 25.01.2012, 17:13
g101k g101k вне форума
Прохожий
 
Регистрация: 17.10.2011
Сообщения: 6
Репутация: 10
По умолчанию

деинкрементный цикл выполняется на 2 такта быстрее в реальном режиме, процу нужно лишь знать сколько раз loop сделать
но и с этим не выграешь.

мне кажется у винды должны быть какие нибудь функции по управлению динамической памятью
Типо нашел где у тебя в памяти объект, злобную винду натравил и все ппц инфе.
Ответить с цитированием
  #5  
Старый 25.01.2012, 22:09
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Цитата:
Сообщение от g101k
мне кажется у винды должны быть какие нибудь функции по управлению динамической памятью
Типо нашел где у тебя в памяти объект, злобную винду натравил и все ппц инфе.
Хорощо бы так, но... в случае динамических массивов не гарантируется, что выделенная память будет идти последовательными кусками. Чаще эти куски разбросанны как попало, и одной командой такую "кашу" не освободить.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #6  
Старый 26.01.2012, 18:12
AlexSku AlexSku вне форума
Специалист
 
Регистрация: 07.05.2007
Адрес: Москва
Сообщения: 884
Репутация: 21699
По умолчанию

А не лучше ли хранить все изображения в одном битмапе? Напр., для TSpeedButton можно загрузить Glyph, у которого ширина в 4 раза больше высоты и содержит 4 изображения.

В DirectX это тоже используют: UVAtlas

Последний раз редактировалось AlexSku, 26.01.2012 в 18:26.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 23:11.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter