Скролирование большого кол-ва данных

1 view
Skip to first unread message

foreground

unread,
Nov 3, 2009, 4:43:34 AM11/3/09
to ruFlash
Подскажите как решается проблема.
Т.е. есть какие-то визуальные элементы со своими размерами и
координатами. Есть прямоугольная видимая скролируемая область.

Pilipenko Dima

unread,
Nov 3, 2009, 4:46:49 AM11/3/09
to ruf...@googlegroups.com
Например скролирование битмапдаты. При остановке показываем нужную
область спрайта с данными и перемещая на нужную позицию.
Скрываю после битмапдату.

foreground пишет:


> Подскажите как решается проблема.
> Т.е. есть какие-то визуальные элементы со своими размерами и
> координатами. Есть прямоугольная видимая скролируемая область.

> --~--~---------~--~----~------------~-------~--~----~
>

foreground

unread,
Nov 3, 2009, 5:33:18 AM11/3/09
to ruf...@googlegroups.com
Допустим данные интерактивные. Это не просто битмап.

Павел Гольцев

unread,
Nov 3, 2009, 5:38:45 AM11/3/09
to ruf...@googlegroups.com
А почему нельзя засунуть все элементы в один клип и уже его скролить?

doomer samoilOFF

unread,
Nov 3, 2009, 5:39:14 AM11/3/09
to ruf...@googlegroups.com

Используй подобие CellRenderer - графика ячейки создается - только, если она видна.


--
Faithfully yours
Samoiloff
_______________
http://samoiloff.com/

Pilipenko Dima

unread,
Nov 3, 2009, 5:45:00 AM11/3/09
to ruf...@googlegroups.com
Ну сделай интерактивный битмап))
Не вижу сложности.

foreground пишет:


> Допустим данные интерактивные. Это не просто битмап.
>

> --~--~---------~--~----~------------~-------~--~----~
>

Jloa

unread,
Nov 3, 2009, 6:15:58 AM11/3/09
to ruFlash
Не, битмап не подойдет т.к. Item может иметь анимацию (over/out/
down...)

>>Используй подобие CellRenderer - графика ячейки создается - только, если она видна.

Это самый грамотный вариант, но трудоемкий.

И еще есть один вариант:
>>Не использую скрол, юзай пейджинг (разделение контента на страницы а ля форум-стайл)

Но б-таки заморочился и написал CellRenderer.

foreground

unread,
Nov 3, 2009, 6:21:22 AM11/3/09
to ruf...@googlegroups.com
CellRenderer написать не проблема.
Проблема в быстрой фильтрации данных по какому-либо условию.

Julius [gmail]

unread,
Nov 3, 2009, 6:24:24 AM11/3/09
to foreground

> CellRenderer написать не проблема.
> Проблема в быстрой фильтрации данных по какому-либо условию.
> --~--~---------~--~----~------------~-------~--~----~
Поясни, пожалуйста, т.к. я не вижу в этом проблемы.
Как минимум есть Array.filter - меня до сих пор устраивал

______________
Jloa.

foreground

unread,
Nov 3, 2009, 6:40:52 AM11/3/09
to ruf...@googlegroups.com
> Julius
фильтром не пользовался. . (может зря)
Делал тестовый пример в нём 2400 элементов и цикл, чето типа:

function redraw()
{
clearPane();
for (var a = 0; a < A; a++)
{
for (var b = 0; b < B; b++)
{
el = fullData[a][b];
if ((scrollOff.x > el.rect.right) || (scrollOff.x + paneW < el.rect.x))
continue;
if ((scrollOff.y > el.rect.bottom) || (scrollOff.y + paneH < el.rect.y))
continue;
createElement(el);
}
}
}

Тормозит непадецки, хотя элементы не очень графикой нагружены.

Julius [gmail]

unread,
Nov 3, 2009, 6:44:35 AM11/3/09
to foreground
Hello, foreground.

> Тормозит непадецки, хотя элементы не очень графикой нагружены.

Дык, я так понимаю сорировка происходит с элементами UI... omg

Попробуйте так:

claer() // или как вы там его обозвали; метод "очистки"
filterData() // фильтруем данные
createUI() // рендерим отфильтрованные данные

______________
Jloa.

foreground

unread,
Nov 3, 2009, 7:05:41 AM11/3/09
to ruf...@googlegroups.com
>Julius
где отличия? )

Julius [gmail]

unread,
Nov 3, 2009, 7:09:53 AM11/3/09
to foreground
Hello, foreground.

redraw() // должен тупо рендерить модель, а не шаманить с ней :)

и лагает т.к. айтемов у вас рендериться 2000 за раз - зачем столько?
Они все видны сразу? Думаю, нет. Вот о том и речь, что нужно написать
CellRender, который будет рендерить только то, что видно.

Кстати, лучше шаманить, мне кажется с моделью.

______________
Jloa.

foreground

unread,
Nov 3, 2009, 7:14:22 AM11/3/09
to ruf...@googlegroups.com
> Julius

Условие сортировки вы видимо не увидили:

if ((scrollOff.x > el.rect.right) ||
(scrollOff.x + paneW < el.rect.x))
continue;
if ((scrollOff.y > el.rect.bottom) ||
(scrollOff.y + paneH < el.rect.y))
continue;

CellRenderer не должен заниматься сортировкой по логике.

Julius [gmail]

unread,
Nov 3, 2009, 7:51:00 AM11/3/09
to foreground
Hello, foreground.

не в давался в код, да и все равно ничего не понятно :)
Смотря, что понимать под "CellRenderer" - в моем понимание это не UI,
а логика.
______________
Jloa.

doomer samoilOFF

unread,
Nov 4, 2009, 7:41:14 PM11/4/09
to ruf...@googlegroups.com
Вам нужна не сортировка, а поиск значения в сортированном массиве. Используйте не перебор хардкодом всех элементов, а например двоичный поиск (http://ru.wikipedia.org/wiki/Двоичный_поиск).
PS: это можно не читать.
Так как у вас для arr[i][j].x < arr[i][k] при условии, что j<k. (т.е. x координата тем больше, чем больше порядковый номер столбца - неубывающая дискретная функция) - то берем вначале индех column_index1=Math.floor(max_column_index/2) - проверяем координату x. Если x > требуемого значения скролла - следующий индекс, который мы попробуем будет column_index2 = columnIndex1 + Math.floor(max_column_index/4) иначе column_index2 = Math.floor(max_column_index/4). И так далее бьем отрезок пополам - пока не найдем нужный нам крайний левый элемент для отображения. И потом можно инкрементить индекс и проверять перебором по условию попадания в видимую область.


Условие сортировки вы видимо не увидили:

                      if ((scrollOff.x > el.rect.right) ||
(scrollOff.x + paneW < el.rect.x))
                              continue;
                      if ((scrollOff.y > el.rect.bottom) ||
(scrollOff.y + paneH < el.rect.y))
                              continue;



foreground

unread,
Nov 6, 2009, 2:23:17 AM11/6/09
to ruf...@googlegroups.com
> doomer samoilOFF
Спасибо за интересную идею. Это наверно не общий случай, но полезно.
Сейчас не могу осмыслить, попробую обязательно.

foreground

unread,
Nov 10, 2009, 5:34:39 AM11/10/09
to ruf...@googlegroups.com
> doomer samoilOFF
Осмыслил. Из теории понятно, что для таблицы элементов это
справедливо. А для случая когда у тебя есть просто массив визуальных
элементов беспорядочно расположенных придётся использовать 4
сортированных массива? Для каждого параметра сортировки.

doomer samoilOFF

unread,
Nov 21, 2009, 1:18:42 AM11/21/09
to ruf...@googlegroups.com
Стоит задача оптимизации рендера или сортировки?

foreground

unread,
Nov 21, 2009, 7:48:55 PM11/21/09
to ruf...@googlegroups.com
> doomer samoilOFF <doomer.s...@gmail.com> написал:

> Стоит задача оптимизации рендера или сортировки?

сортировки. Хочется сделать компоненту раз и надолго.

Reply all
Reply to author
Forward
0 new messages