Форум: "Начинающим";
Текущий архив: 2009.01.18;
Скачать: [xml.tar.bz2];
Вниз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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.006 c