Оптимизация по кадрам для больших наборов данных - PullRequest
0 голосов
/ 06 февраля 2011

Резюме

Я новичок в программировании для iPhone. У меня возникли проблемы с выбором правильной стратегии оптимизации для фильтрации набора компонентов представления в виде прокрутки с огромным содержанием. В какой области мое приложение получит наибольшую производительность?

Введение

Моя текущая версия приложения для iPad позволяет пользователям исследовать довольно большие двоичные древовидные структуры. Деревья содержат от 30 до 900 узлов, и при рисовании внутри прокрутки (с ограниченным увеличением) это выглядит следующим образом.

Screenshot of tree exploration app

Содержимое узлов хранится в модели базовых данных на основе SQLite. Это двоичное дерево, и если у узла есть дочерние элементы, их всегда ровно два. Позиции x и y являются частью модели, так же как и размеры узловых соединений, показанные пунктирными линиями.

Оптимизация

Только около 50 узлов помещаются на экране в любой момент времени. С самыми большими деревьями, содержащими до 900 узлов, невозможно поместить все в прокручиваемый вид, контролируемый и масштабирующий UIView, что является рецептом для сбоев. Поэтому я должен выполнить фильтрацию узлов по кадрам.

И вот тут начинаются мои неприятности. У меня нет опыта для принятия обоснованного решения между возможными вариантами фильтрации, и, кроме того, я, вероятно, не знаю об этой действительно быстрой специальной магии, скрытой глубоко в Objective-C или Cocoa Touch. Поскольку размер резервного хранилища составляет около 200 МБ (около 90 000 узлов в сотнях деревьев), тестирование каждого дерева на устройстве iPad занимает очень много времени. Вот почему я хотел бы попросить вас, ребята, за советом.

Для всех моих попыток я помещаю метод фильтра в scrollViewDidScroll: и scrollViewDidZoom :. Я также блокирую основной поток с помощью фильтра, потому что я все равно не могу показать содержимое без узлов. Но, может быть, у кого-то есть идея в этой области?

Поскольку в модели Core Data присутствует все позиционирование, я мог бы использовать NSFetchRequest для выполнения фильтрации. Это действительно быстро, хотя? У меня есть идея, что это не очень оптимизированный метод.

Из того, что я пробовал, сбойные управляемые объекты, похоже, сразу помещаются в память, но для больших деревьев может быть непросто, когда их содержимое начинает вызывать сбои. Это хорошая идея, чтобы перебрать NSSet узлов и посмотреть, какие элементы должны быть на экране?

Существуют ли другие приемы для повышения производительности? Не могли бы вы найти способы, с помощью которых я мог бы использовать многопоточность для ускорения настройки отображения, даже если контекст модели был создан в главном потоке?

Спасибо за ваш совет, EP.

1 Ответ

0 голосов
/ 06 февраля 2011

По иронии судьбы ваше двоичное дерево можно разделить, используя Разделение двоичного пространства , выполненное в 2D, поэтому рендеринг будет очень быстрым, а количество проверок близко к минимально необходимому.

...