Вы не получаете утечку памяти при звонках на getImageData()
.Источником вашей проблемы является эта строка:
TempImg.src = ImgCanvas.toDataURL("image/png");
Фактически, при каждом выполнении этой строки кода браузер «загружает» другое изображение и сохраняет его в памяти.Итак, в итоге вы получите кеш, который очень быстро растет.Вы можете легко убедиться в этом, открыв сайт в Chrome и перейдя на вкладку ресурсов инструментов разработчика (ctrl+shift+i
).
Чтобы обойти эту проблему, сделайте TempImgCanvas
и сохраните данные изображения на этомcanvas вместо обновления объекта изображения после каждого вызова вашего цикла updateimage()
.
Мне нужно ненадолго отойти, но я могу привести пример через несколько часов, когда вернусь, еслиВы бы хотели.
Редактировать: Я немного изменил структуру и устранил проблему с кэшированием.Вам просто нужно сделать два изменения.Первая заменяет вашу функцию updateimage()
на следующую:
function updateimage() {
var TempImgData = ImgContext.getImageData(0, 0, ImgCanvas.width, ImgCanvas.height);
var NewData = TempImgData.data;
var OrigData = ImgData.data;
//Change image color
var len = 4*ImgData.width*ImgData.height-1;
for(var i=0;i<=len;i+=4) {
NewData[i+0] = OrigData[i+0] * color.r;
NewData[i+1] = OrigData[i+1] * color.g;
NewData[i+2] = OrigData[i+2] * color.b;
NewData[i+3] = OrigData[i+3];
}
//Put changed image onto the canvas
ImgContext.putImageData(TempImgData, 0, 0);
}
Вторая обновляет последнюю строку в draw()
следующим образом:
drawImg(ImgCanvas, Positions[i].x, Positions[i].y, Positions[i].x+Positions[i].y);
Используя этот обновленный код, мы просто ссылаемся на исходные данные базового (белого) изображения и вычисляем новые значения, основываясь на этом каждый раз, когда мы проходим через функцию updateimage()
.Когда вы звоните getImageData()
, вы получаете копию данных изображения на холсте, поэтому, если вы редактируете холст или данные, другой остается без изменений.Для начала вы уже брали исходные данные базового изображения, поэтому имело смысл просто использовать их вместо того, чтобы заново получать их при каждом обновлении.
Кроме того, вы заметите, что я изменил вашпетля, которая немного меняет цвет изображения.Получая дескриптор фактического массива данных, к которому вы хотите обращаться / изменять, вы избавляете себя от необходимости определять местоположение массива из родительского объекта каждый раз, когда вы проходите цикл.Эта техника на самом деле приводит к довольно хорошему повышению производительности.Ваше выступление было хорошим для начала, но не помешает быть более эффективным, поскольку оно довольно прямолинейно.