2011-12-17 2 views
0

мне нужно нарисовать на очень, очень широкий контекст (возможно, углубляясь в 100000-х пикселей в ширину)передовой опыт рисования на очень большой графический контекст

Вещи, которые я рисую просто (исключительно линии, эллипсы и дуги).

В настоящее время я использую механизм черепицы для рендеринга фрагментов этого изображения в виде графики SVG в UIWebViews, сидящей в UIScrollView. Ужасно, я знаю. Производительность настолько плоха, что заставляет меня хотеть причинить себе боль.

Итак, у меня нет выбора, кроме как рисовать вещи прямо в кварце. Проблема в том, что я не мог найти никакой хорошей информации по обработке такого большого рисунка.

Команды будут храниться в массиве (т.е. [0] - строка от x1, x2 до y1,2 [2] - дуга в x1, x2, h, v и т. Д.), Что позволяет немедленно определите, что нужно сделать в любой момент времени.

Как лучше всего обращаться с фактическим чертежом? Сделайте ginormous контекст, затем нарисуйте на нем, стирая части, которые покидают экран? Можно ли рисовать прямо в UIScrollView?

Или я должен выполнять какие-то плитки? Создание небольших представлений и их рисование?

ответ

2

Посмотрите на CATiledLayer. Он поддерживает огромные размеры, но только рисует «плитки», которые видны. Это означает, что в вашем drawLayer:inContext: вам нужно рассчитать, как рисовать плитку, которую вас попросили рисовать. Это может быть довольно сложно реализовать, но повышение производительности компенсирует это. Я использую это, чтобы нарисовать «полоску», которая часто превышает 20 000 пикселей в ширину, с черепицей до 256 пикселей (это значение по умолчанию).

Вы не только хотите этого из-за скорости, но и из-за памяти: если у вас действительно был вид или слой, который был таким большим, он занимал бы огромные объемы памяти. Плитка - единственное решение здесь.

См. this nice article by Michael Heyeck о том, как использовать CATiledLayer (у Apple также есть демо, но я думаю, что связанная статья лучше).

+0

Отлично! Это похоже на то, что мне нужно. – Ben

0

Если материал, который вы рисуете, не является статическим, то использование CATiledLayer (s) не работает очень хорошо. Лучшее решение представлено частично в http://www.mlsite.net/blog/?p=1342. Я использовал это как основу для интерактивного рисования. Немного медленный, но я все еще оптимизирую. Используйте http://red-glasses.com/index.php/tutorials/catiledlayer-how-to-use-it-how-it-works-what-it-does/ в качестве контрольного списка того, следует ли использовать CATiledLayer (ы) или нет.

Смежные вопросы