Быстрая отмена / возврат для редактора растровых изображений при ограничении памяти?

Я пытаюсь написать редактор растровых изображений для мобильного устройства (то есть ограниченной версии Photoshop). Документ пользователя состоит из ~ 4 растровых изображений размером около 1000x500 каждое.

Мне нужна надежная и эффективная система отмены / повтора, которая была бы как можно более простой. Я стремлюсь примерно 0,2 секунды, чтобы отменить или повторить редактирование. Я ищу отзывы о моем текущем предполагаемом подходе или о некоторых новых идеях, которые я могу использовать. Я думаю, что то, что у меня есть, слишком сложно, поэтому я осторожно отношусь к дальнейшим действиям, поэтому было бы хорошо просто знать, что это лучшее, что я могу сделать.

Я экспериментировал с комбинациями использования шаблона Command и шаблона Memento для моей отмены / повторить систему. Вот некоторые выводы, к которым я пришел:

  1. Я не у меня достаточно памяти, и я не могу записать память на диск достаточно быстро, чтобы использовать памятку для поддержки «невыполненной» операции по предыдущей команде во многих ситуациях, например, если пользователь очень быстро выполняет несколько отдельных мазков, я не смогу хранить растровые изображения, которые представляют то, что закрашивал пользователь, не заставляя пользователя ждать их сохранения.

  2. Если я восстановлю документ в его исходное состояние и воспроизведу все команды, кроме последней, для выполнения отмены, это слишком медленно даже после небольшого количества команд, например, повторное воспроизведение 10 мазков или 5 мазков занимает ~ 1 с, что слишком медленно.

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

Подход 2 с 3 работает нормально, за исключением того, что сохранение всего документа становится все медленнее и медленнее по мере добавления слоев, а с 4 растровыми изображениями это уже медленное (~ 5-10 секунд ожидания). Поэтому мне нужно изменить 3, чтобы я сохранял только то, что изменилось с прошлого раза.

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

(Checkpoint1: Save layer 1, 2 and 3.)
Paint on layer 1
Paint on layer 1
(Checkpoint2: Save layer 1. Reuse saved layers 2 and 3 from Checkpoint1.)
Paint on layer 2
Paint on layer 2
(Checkpoint3: Save layer 2. Reuse saved layers 1 and 3 from Checkpoint2.)
Paint on layer 3
Paint on layer 3
Flip layer 3 horizontally.
(Checkpoint4: Save layer 3. Reuse saved layers 1 and 2 from Checkpoint3.)
Resize layer 1, 2 and 3.
(Checkpoint5: Save layer 1, 2, 3.)

Во время редактирования я отслеживаю, какие слои были изменены с момента предыдущей контрольной точки. Когда я восстанавливаю контрольную точку, я восстанавливаю только те слои, которые изменились, например, чтобы восстановить контрольную точку 4 после изменения уровней 2 и 3, Перезагружаю с диска резервные копии 2 и 3 слоя. При добавлении контрольной точки я сохраняю только слой, который был изменен до сих пор. Я могу сделать все это в основном автоматическим, за исключением того, что в моем интерфейсе должны быть места, где пользователь вынужден ждать сохранения контрольных точек, потому что я могу хранить в памяти только 1 временную копию слоя за раз.

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

12
задан memcom 10 October 2010 в 17:55
поделиться