Я изучаю, как писать программу рисования, которая поддерживает отмену и видя, что, скорее всего, шаблон команды - это то, что я хочу. Что-то все еще ускользает от меня, и я надеюсь, что кто-то может дать простой ответ или подтверждение.
В принципе, если я хочу воплотить возможность отменить команду, например, нажимая сплошной круг на экране, означает ли это, что мне нужно по существу копировать буфер кадров, который охватывает круг в память, в этот командный объект? Я не вижу другого способа отменить то, что может быть, например, прошивать кучу случайных цветов пикселей.
Я слышал, что один из подходов состоит в том, чтобы просто отслеживать действия в прямом направлении, и когда выполняется отмена, вы просто начинаете с шага 1 и нажимаете вперед на шаг перед отменой, но это кажется неосуществимым, если вы поддерживайте большой стек отмены.
Возможно, решение - это нечто среднее между тем, где вы храните растровое изображение каждые 15-20 действий и начинаете с последнего "сохранения" вперед.
Может ли кто-нибудь дать представление о том, что является типичным общепринятым подходом в этом случае, сохраняя прямоугольники в командах, переделывая каждое действие вперед или что-то, что я вообще не заметил?
Обновление: много хороших ответов. Всем спасибо. Я думаю из того, что я читаю, я подхожу к этому, сохраняя буфер каждые N действий, и когда пользователь выдает команду отмены, переделайте все команды из самого последнего сохраненного буфера. Я могу настроить N на максимально возможное значение, которое не заметно ухудшает пользовательский интерфейс, требующий отклика (для минимизации использования памяти), но я подозреваю, что на данный момент я действительно не знаю, что я должен быть способный уйти с выполнением нескольких действий в одном кадре, чтобы это было не так уж плохо. Надеюсь, что этот подход позволит мне быстро определить, нужно ли поворачивать другое направление, а вместо этого идти с сохранением битовых искажений для предыдущих состояний для действий, требующих этого.