![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
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 элементов ?
Не верю)