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