Я пытаюсь написать растровый редактор для мобильного устройства (т.е. ограниченную версию Photoshop). Пользовательский документ состоит из ~ 4 растровых изображений размером около 1000x500.
Я хочу, чтобы как можно более прочная и эффективная система отмены/повтора. Я собираюсь около ~ 0.2s для отмены или повторного редактирования. Я ищу некоторые отзывы о моем текущем планируемом подходе или о некоторых новых идеях, которые я могу использовать. Я думаю, что у меня слишком сложная задача, поэтому я осторожно отношусь к тому, чтобы просто знать, что самое лучшее, что я мог сделать, было бы хорошо.
Я экспериментировал с комбинациями использования шаблона Command и шаблона Memento для моей системы отмены/повтора. Некоторые выводы, которые я пришел до сих пор:
-
У меня недостаточно памяти, и я не могу записать память на диск достаточно быстро, чтобы использовать память для поддержки "невыполненной" операции над предыдущей командой во многих ситуациях, например. если пользователь делает несколько отдельных штрихов краски очень быстро, я не смогу хранить растровые изображения, которые отображают то, что пользователь нарисовал, не заставляя пользователя ждать их сохранения.
-
Если я верну документ в исходное состояние и воспроизведу все команды, кроме последнего, чтобы выполнить отмену, это слишком медленно после даже небольшого количества команд, например. повторение 10 мазков краски или 5 мазков ударов занимает ~ 1 с, что слишком вяло.
-
Я могу обойти предыдущую точку, периодически сохраняя весь документ в фоновом режиме на диск и восстанавливая эту контрольную точку перед воспроизведением команд. Чтобы отменить назад, чем последняя контрольная точка, мы перезагружаем контрольную точку до этого и воспроизводим команды.
Подход 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.)
Во время редактирования я отслеживаю, какие слои были изменены с предыдущей контрольной точки. Когда я восстанавливаю контрольную точку, я только восстанавливаю слои, которые изменились, например. чтобы восстановить Checkpoint4 после изменения уровня 2 и 3, я перезагружаю резервные копии слоев 2 и 3 с диска. При добавлении контрольной точки я сохраняю только тот слой, который был изменен до сих пор. Я могу сделать все это главным образом автоматическим, за исключением того, что в моем интерфейсе должны быть места, где пользователь вынужден ждать, пока контрольные точки будут сохранены, потому что я могу хранить только одну временную копию слоя в памяти за раз.
Как вы думаете? Это гораздо сложнее, чем мне хотелось бы, но я не вижу другого пути. Есть ли другие полезные шаблоны, которые я могу использовать, чтобы облегчить мне жизнь?