Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Много динамических компонентов - это медленно

19K
03 апреля 2007 года
Snikex
32 / / 03.04.2007
При создании множества компонентов, а именно TImage на компоненте TPanel (не обязательно панели) встретился с проблемой: Создание каждого последующего компонента проходит значительно медленнее предыдущего. К примеру следующая функция выполняется 100 раз мгновенно, 500 раз - 3 секунды, 2500 раз 2 МИНУТЫ

void CreateNextComponents(TPanel * pContainer, TPoint &Position)
{
TImage * pImage = new TImage(pContainer);
pImage->Parent = pContainer;
pImage->Left = Position.x;
pImage->Top = Position.y;
}

при этом если убрать "pImage->Parent = pContainer;" то все нормально.
Незначительно ускоряет процесс невибимость pContainer.
Я предпологаю, что каждый компонент при создании заносится в какой-то сверхьь-неоптимизированный динамический список данной панели. Может кто знает как ускорить этот процесс.

Да и еще. Code insit у меня так тормозит, что если нажать случайно Ctrl+Space то обождать прийдется несколько минут. В начале я думал, что это из-за большого проекта (более 200 *.cpp файлов ), но когда открыть его в Visual studio все работает мгновенно (правда использую Visual Assist - супер штуковина). Кто может сталкивался с подобным?
19K
03 апреля 2007 года
Snikex
32 / / 03.04.2007
Может кто знает что-нибудь по типу Visual Assist для Buildera
309
03 апреля 2007 года
el scorpio
1.1K / / 19.09.2006
Цитата:

при этом если убрать "pImage->Parent = pContainer;" то все нормально.
Незначительно ускоряет процесс невибимость pContainer.
Я предпологаю, что каждый компонент при создании заносится в какой-то сверхьь-неоптимизированный динамический список данной панели. Может кто знает как ускорить этот процесс.


Указывая адрес объекта X для значения свойства parent (родитель) объекта Y, вы добавляете адрес объекта Y в список Controls объекта X.
Конечно же, хранение 2500*4 = 10КБ информации - это пустяк для любого нормального списка. Но вот только индексируемое свойство Controls используется для прорисовки всех указанных объектов. А Выполнять перерисовку такого количества визуальных компонентов внутри одного окна - весьма накладно :(.
Может в консерватории (условии задания) править надо???

19K
03 апреля 2007 года
Snikex
32 / / 03.04.2007
Цитата: el scorpio
Указывая адрес объекта X для значения свойства parent (родитель) объекта Y, вы добавляете адрес объекта Y в список Controls объекта X.
Конечно же, хранение 2500*4 = 10КБ информации - это пустяк для любого нормального списка. Но вот только индексируемое свойство Controls используется для прорисовки всех указанных объектов. А Выполнять перерисовку такого количества визуальных компонентов внутри одного окна - весьма накладно :(.
Может в консерватории (условии задания) править надо???


Хорошо допустим, что дело в прорисовке, однако после того как все объекты были созданы тормозов не наблюдалось, даже с интенисивными "m_pImage->Picture->Assign(...)" и "m_pImage->Picture->Repaint()", и даже при обновлении по таймеру в 200 мс самой панели с объектами все летало. Если бы дело бало-бы только в прорисовке, то после 2-х минутной процедуры создания объектов на панели, прорисовка этой панели должна была бы длиться приблизительно столько-же. К тому же операция прорисовки невидимого окно в Windows дело шустрое.

А задание то еще похуже: создовать поле 1500X1500 с разнообразными картинками и по одельности их сменять, да и выбирать не приходится.

10
03 апреля 2007 года
Freeman
3.2K / / 06.03.2004
Цитата: Snikex
Если бы дело бало-бы только в прорисовке, то после 2-х минутной процедуры создания объектов на панели, прорисовка этой панели должна была бы длиться приблизительно столько-же.


Угу. Похоже, дело табак. При таком количестве объектов задержка происходит, по всей видимости, из-за неэффективного перераспределения памяти в списках типа TList FControls и FComponents.

Хреновей всего, что проблема, на первый взгляд, нерешаема без переписывания TComponent и TWinControl, что, сам понимаешь, кхем... Достаточно ведь в нужном месте добавить FComponents.Capacity := <нужное число>. Но оно внутри Classes. Нда.

Похоже, дело действительно в "консерватории", точнее, способе решения. Придётся создавать собственный компонент, позволяющий хранить и рисовать набор из большого числа мелких кусочков без подобных накладных расходов. Ну, или тупо хранить в TList с предварительно установленным Capacity, а рисовать вручную, через Image1.Picture.Bitmap.Canvas.Draw(336, 10, Piece122);

19K
04 апреля 2007 года
Snikex
32 / / 03.04.2007
Кто хочет поприкалвайтесь над исходниками
520
05 апреля 2007 года
inkognitum
155 / / 03.05.2006
Не могу понять зачем тебе 2500 Image на одной панели?! :) куда столько.
А если и понадобились то проще воспользоватся регионами и уже в них врисовывать нужную картинку...
ТАк же в дальнейшем можно отследить над каким регионом наведена мышь или на какой регион нажали мышью!

Работать будет мгновенно и ресурсов сьест меньше!
19K
05 апреля 2007 года
Snikex
32 / / 03.04.2007
Цитата: inkognitum

А если и понадобились то проще воспользоватся регионами и уже в них врисовывать нужную картинку...
ТАк же в дальнейшем можно отследить над каким регионом наведена мышь или на какой регион нажали мышью!

Работать будет мгновенно и ресурсов сьест меньше!



Совет замечательный. Все летало, но заказчик гифки навязывает, и на уступки неидет, может еще есть варианты

520
05 апреля 2007 года
inkognitum
155 / / 03.05.2006
Дык GIF формат TImage так и так не поддерживает (в смысле анимацию).
Вариант есть!
Если найдешь копанент который будет проигрывать GIF формат и сможешь расплодить его до 2500 копий без всяких ошибок то:

Во время создавания нового объекта и присваения ему родителя самого родителя сделай невидемым. (это сократит время создавания)
А как все создашь покажи родителя с готовыми картинками.

А еще один вариант, если заказчик такой требовательный мол чтобы быстро все и сразу и ждать не могу 2 минуты, то скажи есть такая весЧ как системные требования ПО! :)
19K
06 апреля 2007 года
Snikex
32 / / 03.04.2007
Цитата: inkognitum
Дык GIF формат TImage так и так не поддерживает (в смысле анимацию).
Вариант есть!
Если найдешь копанент который будет проигрывать GIF формат и сможешь расплодить его до 2500 копий без всяких ошибок то:
Во время создавания нового объекта и присваения ему родителя самого родителя сделай невидемым. (это сократит время создавания)
А как все создашь покажи родителя с готовыми картинками.



Я понимаю нащет гиф, TImage был к примеру. Идея сделать компонент невидимым хорошая, но не слишком увеличивает скорость создания, зато насчет требования ПО я стобой согласен на все 100%

309
06 апреля 2007 года
el scorpio
1.1K / / 19.09.2006
Вывод: ставишь заказчика перед фактом и требуешь изменения технического задания.
19K
09 апреля 2007 года
Snikex
32 / / 03.04.2007
Ну что !! Всем спасибо. Теперь спать могу спокойно. Но всеже если кто придумает (или я придумаю) достойный способ зделать все быстро Буду рад написать или прочитать этот способ
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог