Проблемы с беззастенчивостью - PullRequest
1 голос
/ 14 декабря 2010

Мой код выглядит следующим образом -

[[NSColor whiteColor] set];
// `path' is a bezier path with more than 1000 points in it
[path setLineWidth:2];
[path setLineJoinStyle:NSRoundLineJoinStyle];
[path stroke];
// some other stuff...

Запустив инструмент профилирования времени в Instruments, он говорит, что мое приложение тратит 93,5% времени на последнюю строку [path stroke], а Quartz Debugger сообщает, что мое приложение работает только со скоростью менее 10 кадров в секунду (другой взгляд меняет положение поверх него всегда происходит обновление).

Я ищу способы улучшить производительность поглаживания пути Безье, иногда пути с более чем 1000 точками рисуются очень быстро с> 60 кадрами в секунду, однако в некоторых крайних случаях даже с тем же количеством точек, возможно, если точки слишком далеко друг от друга (или слишком плотно?), производительность становится очень вялой.

Я не уверен, что я могу с этим поделать. Я думаю, что кэширование представления как растрового представителя полезно, но оно не может помочь с изменением размера в реальном времени.

Редактировать: комментирование строки [path setLineWidth:2];, безусловно, помогает, но путь выглядел действительно слишком «тонким».

Ответы [ 4 ]

6 голосов
/ 14 декабря 2010

Вы можете настроить плоскостность кривой с помощью метода setFlatness :, более высокие значения увеличивают скорость рендеринга за счет точности. Например, вы должны использовать более высокое значение при изменении размера в реальном времени.

3 голосов
/ 14 декабря 2010

Когда я спросил об этом команду разработчиков Quartz 2D в Apple, они сказали мне, что самый большой фактор эффективности прохождения пути с большим количеством точек - это то, сколько раз он пересекается. Есть много работы, которая входит в правильное сглаживание пересечения.

2 голосов
/ 14 декабря 2010

Вы строите путь при каждом розыгрыше - меняется ли он от чертежа к чертежу? Звучит так, будто все меняется. Кэширование может происходить, если вы рисуете один и тот же путь снова и снова, поэтому попробуйте создать его и хранить до тех пор, пока он не изменится. Это может помочь.

Вы также можете выбрать один или два уровня API. Возможно, объекты CALayer могут делать то, что вы хотите. Другими словами - действительно ли у вас есть линия из 1000 точек, которую нужно изогнуть, чтобы соединить точки? Вы можете сделать кучу объектов CALayer для рисования отрезков.

Математика на этих процессорах очень быстрая. Вы также можете написать математическую процедуру, чтобы выбросить ненужные точки, например, сократить число с 1000 до 200 или около того. Математика будет пытаться устранить точки, которые находятся близко друг к другу и т. Д.

Моя ставка на математику - выбрасывать очки, которые не имеют никакого визуального значения. Плоская штука тоже звучит интересно - может быть, если вы идете ровно, вы делаете отрезки.

0 голосов
/ 14 декабря 2010

Что вы имеете в виду, когда говорите

другой вид, изменяющий положение поверх него, всегда вызывает обновление

??

DoВы имеете в виду, что вы не перерисовываете изображение со скоростью 60 кадров в секунду?Тогда именно поэтому вы не видите 60fps.

Когда

Инструменты говорят мне, что мое приложение тратит 93,5% времени

что-то делать, это не означает «все доступное» время, это означает, что ваше приложение потребляет 93,5% процессорных циклов.то есть, это может быть совсем не время.Недостаточно определить, что вам нужно оптимизировать.Я не говорю, что вам это не нужно, или что поглаживание массивных Безье не слишком медленное.Только это само по себе ничего не значит.

...