Недостаток нескольких холстов для реализации отмены / повтора в 2D-контексте на холсте javascript?

В настоящее время у меня есть единственный 2D-контекст/холст для всех линий, нарисованных с помощью lineTo(), но я хотел реализовать функцию отмены/повторения, которая невозможна без повторной перерисовки всего холста или сохранения состояний (1, 2).

По сравнению с другими методами, есть ли недостаток в добавлении нового холста для каждой строки, нарисованной в стеке? С точки зрения временной сложности отмена/повторное выполнение будет O(1) вместо O(n), но я не уверен, будут ли другие проблемы.


person Danny    schedule 29.12.2019    source источник
comment
Первая ссылка, которую вы разместили, в значительной степени объясняет, что этот подход плохо влияет на память и производительность. При таком подходе вы по-прежнему сохраняете состояния, за исключением того, что состояние представляет собой весь холст, а не несколько чисел в массиве. Где вы пришли к O (1) здесь?   -  person ggorlen    schedule 29.12.2019
comment
помните, что каждый холст занимает ширину * высоту * 4 * 8 байтов в памяти только для данных пикселей. Допустим, у вас есть область рисования размером 500x500 пикселей (довольно мало для монитора с высоким разрешением), каждый отдельный холст будет занимать 8 МБ. Некоторые ОС (iOS) не позволят вам иметь общую площадь холста на странице более нескольких квадратных пикселей, поэтому в этих ОС вы сможете сохранить не более десяти состояний.   -  person Kaiido    schedule 29.12.2019
comment
@Kaiido, это именно то, что я искал. Спасибо!   -  person Danny    schedule 29.12.2019
comment
@Kaiido Я ничего не знаю о холстах HTML; почему каждый пиксель 32 байта? Я бы предположил, по крайней мере, четыре (R, G, B, непрозрачность) — каковы остальные 28?   -  person Dave Newton    schedule 29.12.2019
comment
@DaveNewton Красный Зеленый Синий и Альфа-каналы хранятся как uint8bits   -  person Kaiido    schedule 29.12.2019
comment
@Kaiido Это 4 байта на пиксель или 1 МБ — зачем все остальное?   -  person Dave Newton    schedule 29.12.2019
comment
@DaveNewton Проверяю, проснулся ли ты лучше, чем я? Вы совершенно правы конечно   -  person Kaiido    schedule 29.12.2019
comment
@Kaiido :) Проверяю свое здравомыслие - я должен за этим следить ;)   -  person Dave Newton    schedule 29.12.2019


Ответы (1)


Как упоминали ggorlen и Kaiido, недостатком здесь является память, как и при сохранении предыдущих состояний в других сообщениях, поскольку каждый холст по-прежнему занимает весь размер холста в памяти.

person Danny    schedule 29.12.2019