Главная страница
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.014 c
1-1196766772
Alexx1524
2007-12-04 14:12
2009.01.18
Плагины


2-1228392234
linx
2008-12-04 15:03
2009.01.18
Лишние знаки после запятой при отображ. результ. запр.в DBGreed


2-1228244925
Serg
2008-12-02 22:08
2009.01.18
Статус интернет


15-1227583427
Slider007
2008-11-25 06:23
2009.01.18
С днем рождения ! 25 ноября 2008 вторник


10-1152168445
Tsvilikh Anton
2006-07-06 10:47
2009.01.18
COM объекты и глобальные политики безопасности