Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Прорисовка большого количества TBitmap, Может быть можно побыстрее? 
V
    Опции темы
Veitmen
Дата 11.11.2006, 20:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 288
Регистрация: 10.11.2006
Где: СПБ

Репутация: нет
Всего: 4



Привет всем.

Я делаю САПР редактор электрических, долбанных. схем. Резисторы там всякие и подобная лабудень... 

Алгоритм такой: выбираем элемент, кликаем, он прорисовывается, при этом в БД сохраняеются его координаты и внешний ключ на таблицу всех элементов, В этой таблице его имя и его Битмап. Когда удаляю элемент, или что нибудь типа этого делаю, то удаляю элемент из БД, закрашиваю область, делаю выборку из таблицы с координатами, потом делаю выборку по внешнему ключу и загружаю картинки элемента. После этого его прорисовываю. и так пока все не прорисую. Проблема в том что если элементов не мало, то процесс перерисовки длится очень долго.

Я тут подумал и решил что проще будет если динамически создавать TImage и в каждый загружать картинку, тогда перерисовку делать не придется. А можно будет работать с каждой картинкой как с отдельным объектом, а не с Canvas, как я делаю это сейчас.

Короче понял я это и еще понял что всю программу почти придется переделывать. Вот и хочу спросить, может быть можно как нибудь по другому ускорить процесс перерисовки? Закрашивать только один элемент нельзя, может закраситься и другой. Хотя можно попробовать написать алгоритм который будет смотреть есть ли в закрашенной области еще элементы. Но это по моему не выход, это из гранотомета мух бить.  Короче предлагайте чего нибудь. Может с памятью как нибудь поработать? Может Канвас можно сохранять, а потом его восстанавливать? Буду признателен за любую помощь.  
PM MAIL ICQ   Вверх
Guedda
Дата 11.11.2006, 20:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Подрывник
****


Профиль
Группа: Завсегдатай
Сообщений: 3137
Регистрация: 27.12.2005
Где: Ростов-на-Дону

Репутация: 14
Всего: 78



А может вместо TBitmap использовать TCanvas, а в таблице хранить просто координаты рисования элементов.


--------------------
Ll 2
PM MAIL WWW ICQ Skype GTalk   Вверх
Veitmen
Дата 11.11.2006, 21:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 288
Регистрация: 10.11.2006
Где: СПБ

Репутация: нет
Всего: 4



Цитата

А может вместо TBitmap использовать TCanvas, а в таблице хранить просто координаты рисования элементов.

 Тут короче так: 
1 - Таблица: ID,Type_El,Picture
2 - Таблица: ID,координаты,FK_ПЕРВОЙ_ТАБЛИЦЫ

В первой храняться просто все типы элементов, во второй храняться нарисованные элементы.
Рисую я их через канвас, если ты это имел ввиду. Через процедуру.
Код

procedure TDrawObject.Draw(Canvas: TCanvas;Picture : TBitmap);
begin
  Canvas.Draw(X,Y,Picture);
end;

И для каждого объекта таблицы 2 вызывается эта функция. И когда их много, то все очень долго.

Это сообщение отредактировал(а) Veitmen - 11.11.2006, 21:12
PM MAIL ICQ   Вверх
Alexeis
Дата 11.11.2006, 21:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



Veitmen, удобно для этого использовать компонент TImageList. Все элементы (если они одинакового размера) рисуются на одном битмапе, а затем загружаются в TImageList. Теперь к кажому элементу легко обратится по его индексу. Этот способ очень быстрый. 

p.s. Если не все картинки одного размера, то можно сделать несколько TImageList, в каждом из которых будут изображения одинакового размера.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Veitmen
Дата 11.11.2006, 22:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 288
Регистрация: 10.11.2006
Где: СПБ

Репутация: нет
Всего: 4



Хм... А мне кажется долго не из за загрузки картинок, а их прорисовки. Вот. Даже если я буду использовать лист, то все равно каждую картинку, а их на схеме около пятидисяти минимум, надо прорисовывать отдельно. 
Это все равно цикл, где берем координаты и !!КАЖДУЮ!! картику прорисовываем. Я думаю прирост если и будет то не большой. Но идею я думаю можно попробовать. Но вот беда вся в том, что моя прога может расширяться за счет бд. И очень просто. И картинку для каждого нового элемента можно указать и она сохраняется в базе. Мне это не помешает в реализации расширения БД?? Да и на безопасности,хранение картинок в папках, не скажется очень положительно. Я хочу вот что узнать, можно как нибудь сделать, ну типа бекапа моего Канваса? А потом просто загружать его?

Это сообщение отредактировал(а) Veitmen - 11.11.2006, 22:06
PM MAIL ICQ   Вверх
Alexeis
Дата 11.11.2006, 22:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



Цитата(Veitmen @  11.11.2006,  22:03 Найти цитируемый пост)
Мне это не помешает в реализации расширения БД??

Я предлагаю вообще отказаться от БД. Обращение к БД слишком медленное оно и тормозит прорисовку. Отрисовка очень быстрая... 

Цитата(Veitmen @  11.11.2006,  22:03 Найти цитируемый пост)
Но вот беда вся в том, что моя прога может расширяться за счет бд

И что тут сложного. Дорисовать картинку и все.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Veitmen
Дата 11.11.2006, 22:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 288
Регистрация: 10.11.2006
Где: СПБ

Репутация: нет
Всего: 4



Не соглашусь. Тогда мне придется записывать все параметры в файл. В ини например. Ну и где произойдет быстрее выборка? У меня через запрос с жестким критерием поиска, или полный поиск в ИНИ файле, со считыванием данных и всех координат?
Хотя может я не прав, но у меня такая точка зрения.ъ
Да и что касается размеров битмапа, то он тоже может быть разный. Я вот все больше склоняюсь к динамическому созданию TImage и последующей загрузкой моего битмапа IMage.Picture.BItmap. Тогда вообще с каждой картинкой я смогу работать как с отдельным объектом.  Как это откликнется? Это нормальное действие или нет?
PM MAIL ICQ   Вверх
Alexeis
Дата 11.11.2006, 23:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



Цитата(Veitmen @  11.11.2006,  22:42 Найти цитируемый пост)
или полный поиск в ИНИ файле, со считыванием данных и всех координат?

Зачем? Если же картинки  одинакового размера. Эту работу за вас делает TImageList автоматически.
 
Цитата(Veitmen @  11.11.2006,  22:42 Найти цитируемый пост)
Да и что касается размеров битмапа, то он тоже может быть разный. 
 Ну можно же его немного увеличить, чтоб у большинство картинок имело одинаковый размер.

Даже если и записывать координаты в ини файл, то кто мешает их считать сразу в массив и работать с ним. У вас же не 100000 различных рисунков smile База данных хороша, когда имеется огромное число записей и их надо периодически изменять, добавлять и искать, а так же обеспечить параллельный доступ  нескольких клиентов. Тут же нужно все перегнать в ОЗУ и обращаться к каждому элементу по его индексу. Делать отдельный объект для каждого элемента, не эффективно из-за излишнего расхода памяти и замедления процесса загрузки и завершения работы программы.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Veitmen
Дата 11.11.2006, 23:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 288
Регистрация: 10.11.2006
Где: СПБ

Репутация: нет
Всего: 4



alexeis1, Да ты прав. картинки можно подогнать... Да, можно попробовать чего нить придумать.) Спасибо народ, вставили мне мозги на место!) Спасибо всем!)
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0674 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.