Быстрая отмена/восстановление с сувениром/шаблоном "команда"?

Я пишу JAVA-приложение рисования/графики для мобильного телефона (таким образом, память ограничена). Состояние приложения равняется по существу трем 1000x500 битовые массивы (т.е. слои рисования). Загрузка трех битовых массивов занимает приблизительно 2 или 3 секунды.

Я пытаюсь записать механизм отмены, но я просто не могу разработать хороший способ сделать это. Типичные подходы:

  • Используйте шаблон "команда": Когда Вы отменяете, Вы перезагружаете состояние начального файла и затем воспроизводите все команды, обработанные до сих пор за исключением заключительной. Выполнение этого наивно, хотя средства, ожидая 2 или 3 секунды для загрузки начального состояния, которое является слишком медленным. Нет достаточной памяти для хранения начального состояния в памяти также.

  • Используйте шаблон "memento": Когда Вы отменяете, Вы заменяете часть текущего состояния, которое было изменено со старым состоянием. Это означает каждое действие потребности сохранить битовые массивы на диск старого состояния, потому что просто нет достаточной памяти на мобильном устройстве для хранения этого в памяти. Как сохраняющие битовые массивы занимает время, как я справляюсь, если пользователь решает, например, нарисовать много мазков кисти в быстрой последовательности? Я не могу заставить их ожидать.

Все мои решения включают сложные гибриды вышеупомянутых шаблонов.

Кто-либо может предложить решение, которое позволило бы мне иметь довольно быструю отмену/восстановление для своего приложения?

6
задан BobDuck 14 July 2010 в 20:16
поделиться

1 ответ

Существует третий распространенный метод обработки отмены. Это хранение различий между двумя состояниями в объекте Undo. Это можно делать в виде фактических различий (т.е. какие пиксели изменились и на что они изменились), но это, вероятно, почти так же расточительно по отношению к памяти, как хранение битовой карты на каждом этапе.

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

В качестве еще одного предложения, используйте упомянутый вами командный подход, но сохраните битовую карту для предыдущего шага. Когда пользователь делает отмену, немедленно отобразите кэшированную битовую карту с предыдущего (n-1) шага, а затем начните вычислять битовую карту для n-2, чтобы вы были готовы к тому моменту, когда он снова нажмет отмену.

9
ответ дан 9 December 2019 в 22:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: