Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

TList и много объектов [D7, WinXP]


Vitaliy_____ ©   (2008-12-02 11:23:00) 

Доброе время суток!
Есть такая проблема: существует программа, с которой я сейчас работаю. Часть ее - графический редактор. В структуре данных, разработанной черт знает когда задумано следующее:

1) Все "точки" объектов хранятся в одном большом списке на основе TList
2) Допустим, "линия" представлена как атрибуты линии + два числа - номера первой и последней точек.

При работе с множеством объектов возникает проблема: выборка точки из списка (делается через Items:   TozList.Items[i]) становится продолжительной (речь о неск. десятках тысяч линий и не менее неск. сотен тысяч точек).
Вопроссостоит в том, можно ли ускорить скажем рисовку линии, не изменяя описанной выше структуры хранения данных?
Гарантированно, что точки в списке лежат последовательно. Можно ли выбрав первую точку линии (29357 в списке точек, например), "быстро" получить (видимо не через .Items[29358]) следующую точку.
Есть ли у кого мысли по этому поводу - буду рад услышать!


Anatoly Podgoretsky   (2008-12-04 11:04:00) [1]

> MsGuns  (04.12.2008 10:35:08)  [8]

Если квадрат, то тоже две ссылки, вот полилайн ничем не ограничен.


MsGuns   (2008-12-04 10:35:00) [2]

>1) Все "точки" объектов хранятся в одном большом списке на основе TList
>2) Допустим, "линия" представлена как атрибуты линии + два числа - номера первой и последней точек.

Т.е. если есть квадрат 100х100 пикселей, то в списке будет 10000 ссылок ?


Vitaliy_____   (2008-12-04 06:16:00) [3]

Гм, спасибо Сергей М.за его недоверие :) Не поленился проверить, создал отдельную программку, сгенерировал 1,000,000 точек, 10,000,000 раз взял случайную точку и потратил на это 0.2 секунды. У нас таких объемов пока нет и вряд ли будет, проблема явно не тут :) Заодно нашел в программе некорректную работу с памятью в части добавления - но это уже другая песня.
icWasyaТут есть проблема, что при удалении точек без Pack будут пустые ссылки в списке, а проверять на nil - не будет выгоды чем просто Items использовать.
В общем, тему можно закрыть, собака порылась не тут :)


icWasya   (2008-12-02 14:12:00) [4]

можно чуть ускорить - за счёт убирания вызова процедуры

вместо
var
 TozList:TList;
 Toz:TObject;
...
for i:=0 to TozList.Count-1 do
Toz:=TObject(TozList.Items[I]);


var
 TozList:TList;
 P:PPointerList;
 Toz:TObject;
...

P:=TozList.List;

for i:=0 to TozList.Count-1 do
Toz:=TObject(P[I]);


Сергей М.   (2008-12-02 12:36:00) [5]


> кто может объяснить или дать ссылку на описание структуры
> TList?


Это не структура, а класс.

см. исходники в classes.pas


> Проблема именно с доступом к данным


Доступ к i-му указателю, хранящемуся в списке, контролируемому объектом класса TList, осуществляется мгновенно.

Влияние свопинга при этом не учитываем - это твоипроблемы.


Palladin   (2008-12-02 12:31:00) [6]


> Vitaliy_____   (02.12.08 12:28) [3]

:))) нет, TList это не связанныйсписок, это обыкновенный список - массив. И что бы обратится к i элементу нужно просто обратиться к i элементу. Все в справке написано.


Vitaliy_____   (2008-12-02 12:28:00) [7]


> При размере списка 30000 элементов ?
> Не верю)

300 000
Может кто может объяснить или дать ссылку на описание структуры TList? Если это СПИСОК, то для получения i-го элемента надо перейти от первого к нему через все промежуточные. Хотя List property (TList) настораживает, видимо у него есть ссылки на все элементы списка. В любом случае, работа со списком медленная, так как перерисовка всех данных с чтением их из файла (не занесить в память а сразу отрисовывать) происходит быстрее чем при рисовки тех же данных из памяти (смешно, правда?!)...
Проблема именно с доступом к данным а не с рисовкой.


Jeer   (2008-12-02 11:56:00) [8]


> можно ли ускорить скажем рисовку линии,


Вот здесь и копай - доступ по индексу не должен настолько замедлять, чтобы стало нетерпимо больно.


Сергей М.   (2008-12-02 11:31:00) [9]


> выборка точки из списка (делается через Items:  TozList.
> Items[i]) становится продолжительной


При размере списка 30000 элементов ?
Не верю)


Наверх

Титульная страница Поиск, карта сайта Написать письмо