Отмена в приложениях для рисования, таких как Penultimate и iDraft - PullRequest
0 голосов
/ 07 декабря 2010

В таких приложениях, как iDraft и Penultimate, они выполняют отмены и повторы очень хорошо без каких-либо задержек.

Я перепробовал много подходов. В настоящее время мое приложение для тестирования записывает необработанные данные пикселей непосредственно в файл после каждой отмены, используя [NSData writeToFile: atomically:], но я получаю задержку 0,6 с.

Кто-нибудь может дать намеки на это?

Ответы [ 3 ]

1 голос
/ 25 января 2011

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

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

1 голос
/ 07 декабря 2010

Я не знаю ни iDraft, ни Penultimate, но, скорее всего, у них более простая модель рисования, чем у вас.При написании приложения для рисования вы можете выбирать между двумя основными чертежными представлениями: либо вы отслеживаете необработанные пиксели, либо вы отслеживаете объекты рисования, такие как линии, круги и т.(Или, другими словами, вы выбираете между пиксельным и векторным представлением.)

Когда вы рисуете с использованием векторов, вы не отслеживаете отдельные пиксели.Вместо этого вы знаете, что между точками X и Y должна быть линия заданной ширины, цвета и других параметров.И когда вам нужно нарисовать такое представление, вы вызываете Quartz, чтобы провести линию.В этом случае модель (представление чертежа) состоит из нескольких чисел, занимает мало памяти, и поэтому в памяти может быть много версий одного чертежа, что позволяет быстро и удобно отменить и повторить.

0 голосов
/ 03 апреля 2011

Как уже говорилось ранее, вам, вероятно, не нужно записывать данные на диск для каждой операции, в том числе в пиксельном случае, если только вы не пытаетесь отменить полноэкранный фильтр, все, что вам нужно сохранить, - это данные, содержащиеся в ограничивающий прямоугольник мазка кисти, который выполнил пользователь.

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

Этот метод распространяется на повтор, при отмене возьмите область, которую вы собираетесь перезаписать, и сохраните ее.

...