Лучшие практики, опирающиеся на очень большой графический контекст - PullRequest
0 голосов
/ 17 декабря 2011

Мне нужно рисовать в очень, очень широком контексте (возможно, с точностью до 100 000 пикселей по ширине)

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

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

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

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

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

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

Ответы [ 2 ]

2 голосов
/ 17 декабря 2011

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

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

См. эту замечательную статью Майкла Хейека о том, как использовать CATiledLayer (у Apple также есть демонстрационная версия, но я думаю, что связанная статья лучше).

0 голосов
/ 26 ноября 2013

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

...