Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.01.18;
Скачать: CL | DM;

Вниз

TList и много объектов   Найти похожие ветки 

 
Vitaliy_____   (2008-12-02 11:23) [0]

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

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

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


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


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


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


 
Jeer ©   (2008-12-02 11:56) [2]


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


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


 
Vitaliy_____   (2008-12-02 12:28) [3]


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

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


 
Palladin ©   (2008-12-02 12:31) [4]


> Vitaliy_____   (02.12.08 12:28) [3]

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


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


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


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

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


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


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

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


 
icWasya ©   (2008-12-02 14:12) [6]

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

вместо
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]);


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

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


 
MsGuns ©   (2008-12-04 10:35) [8]

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

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


 
Anatoly Podgoretsky ©   (2008-12-04 11:04) [9]

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

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



Страницы: 1 вся ветка

Текущий архив: 2009.01.18;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.015 c
2-1228213679
Sasha
2008-12-02 13:27
2009.01.18
TServerSocket и интернет


2-1228127753
linox
2008-12-01 13:35
2009.01.18
ADOTable + фильтр


2-1228326483
Юрии
2008-12-03 20:48
2009.01.18
Раскладка клавиатуры


2-1228396508
Учащийся
2008-12-04 16:15
2009.01.18
TVarRec


15-1227090166
matt
2008-11-19 13:22
2009.01.18
Assertion failed в Delphi 2007