Как правильно сделать так, чтобы основная графика не отставала? - PullRequest
1 голос
/ 03 октября 2011

Я использую UIBezierPath для рисования пальцем (мое приложение). Я создаю его, используя путь = [путь Безье UIBezierPath]; , Он постоянно отстает от iPad (и вызов изнутри drawrect ничего не изменил). Я работал над этим часами и не нашел решения, только отставание. Кто-нибудь будет так любезен, чтобы помочь мне, пожалуйста? Кроме того, я использую NSTimer для вызова функции. Это старый способ, которым мое приложение будет работать, поэтому, пожалуйста, помогите мне исправить это отставание !!!!!

Ответы [ 2 ]

10 голосов
/ 03 октября 2011

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

Сначала втяните drawRect: и больше нигде.

Это так важно, что яЯ скажу это снова.

Ничья в drawRect: и больше нигде.

Не touchesMoved:withEvent:.

Не touchesBegan:или Ended:.

drawRect: и больше нигде.

Если вы создаете изображение для сохранения в файл , это одно.Но когда вы рисуете на экран, вы не делаете это нигде, кроме drawRect:.

Серьезно.Это так важно.

Шаг 2: Не пытайтесь заставить рисование произойти в любое другое время.

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

На самом деле, это всего лишь расширение шага 1. Если вы звоните drawRect:, это ничем не отличается от того, что у вас был код рисования, по которому у вас был вызов.Код рисования не повторяется повсеместно, что хорошо, но он все еще выполняется в неподходящее время. Пусть drawRect: вызывается только тогда, когда система вызывает его.

setNeedsDisplay существует, чтобы сообщить системе, что пришло время рисовать.Вы должны сделать это, когда, и только , когда что-то изменилось, что вам нужно будет нарисовать.Свойства вашего представления, что-то в модели - всякий раз, когда что вы будете вносить изменения, отправляйте себе setNeedsDisplayНе делай этого в любое другое время;Вам не нужно.

Выключите таймер.Тебе это не нужно.В любом случае, там уже есть таймер, ограничивающий вас до 60 кадров в секунду.

Core Graphics не отстает.Нет, правда, это не так.Замедление или «отставание» объясняется тем, что либо вы пытаетесь сделать слишком много, либо делаете что-то не так.

Не кешируйте без необходимости.Ничто из того, что вы делаете, не требует кеша изображений.

«Задержка» заключается в том, что вы пытаетесь рисовать или форсировать рисование с touchesMoved:withEvent: и / или touchesBegan: / Ended:.См. Выше.


Вот что вам нужно сделать:

В ваших touchesBegan: / Moved: / Ended: методах или других соответствующих методах респондента обновите ваше состояние,Это будет включать путь Безье. Не рисовать , включая , не вызывать drawRect: или иным образом пытаться вызвать рисование.

После того, как вы обновили свое состояние, и только если выСделав это, отправьте себе setNeedsDisplay.

в своем методе drawRect: и только в своем методе drawRect:, нарисуйте путь, градиент, что угодно, как вы видитеfit.

Делайте эти вещи, и ваше приложение будет быстрым.С основной графикой.Без задержки.


Также, некоторые важные чтения:

1 голос
/ 03 октября 2011

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

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

сложное приложение для iPad с сенсорным рисунком может потребовать много времени для рендеринга в реальном времени, особенно когда вы перерисовываете. рисовать только при необходимости.

другой вариант: работа в слоях

у вас, вероятно, нет отмены в вашем приложении, поэтому она должна быть простой в реализации. периодически комбинируйте ваше изображение до одного представления. когда вызывается рисование прямоугольника, у вас появляется меньше путей для рисования (1 большое изображение + меньше путей). в этом случае, безусловно, поможет кэшированное растровое изображение.

Опять же, в ваших сообщениях не так много подробностей, и вы не сказали нам, что показывает профилировщик.

...