Быстрая отмена / повтор с шаблоном памяти / команды? - PullRequest
6 голосов
/ 15 июля 2010

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

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

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

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

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

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

Ответы [ 2 ]

9 голосов
/ 15 июля 2010

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

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

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

2 голосов
/ 03 мая 2011

О вашем Используйте шаблон команды point: запуск из исходного состояния и повторное выполнение команд вообще не нужны.Каждый класс Command должен представлять небольшое пользовательское действие и должен иметь механизм для отмены того, что он делает в своем методе execute (), если должна поддерживаться операция отмены.Мы поддерживаем стек объектов *** Command.Когда пользователь что-то отменяет, объект Command извлекается из стека и вызывается его метод undo ().

Я не вижу никакой мотивации для использования шаблона memento в вашем случае, так как действия по отмене будут в FIFOпорядок.Пользователь не имеет права отменять действия, как ему кажется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...