Я работаю с относительно большим холстом, на который нарисованы различные (сложные) вещи. Затем я хочу сохранить состояние Canvas, поэтому я могу быстро reset перейти к состоянию, которое оно сейчас находится в более поздней точке. Для этого я использую getImageData и сохраняю данные в переменной. Затем я нарисую еще немного материала на холст и позже reset Canvas, где он был, когда я сохранил его состояние, используя putImageData.
Однако, оказывается, что putImageData очень медленный. Infact, он медленнее, чем просто перерисовывает весь холст с нуля, что включает в себя несколько drawImage, покрывающих большую часть поверхности, и более 40 000 операций lineTo, за которыми следуют штрихи и заливки.
Перерисовывая холст размером примерно 2000 х 5000 пикселей с нуля, занимает ~ 170 мс, используя putImageData, хотя и занимает колоссальные 240 мс. Почему putImageData так медленно по сравнению с перерисованием холста, хотя перерисовывание холста включает в себя заполнение почти всего холста drawImage, а затем снова заполнение примерно 50% холста полигонами с использованием lineTo, штрихов и заполнения. Таким образом, каждый пиксель, по крайней мере, один раз затрагивался при перерисовке.
Поскольку drawImage кажется намного быстрее, чем putImageData (в конце концов, drawImage для перерисовки холста занимает менее 30 мс). Я решил попытаться сохранить состояние canvas, не используя getImageData, но вместо этого используя canvas.toDataURL, а затем создав изображение из URL-адреса данных, который я бы вставлял в drawImage, чтобы нарисовать его на холсте. Оказывается, вся эта процедура выполняется намного быстрее и занимает примерно 35 мс.
Итак, почему putImageData намного медленнее, чем альтернативы (используя getDataURL или просто перерисовку)? Как я мог ускорить процесс? Есть ли и, если, вообще говоря, лучший способ сохранить состояние холста?
(Все номера измеряются с помощью Firebug из Firefox)