Освобождение ImageData при удалении холста - PullRequest
0 голосов
/ 17 января 2011

Я пишу приложение XUL, используя HTML Canvas для отображения растровых изображений. Я генерирую ImageDatas и импортирую их на холст, используя функцию putImageData:

  for(var pageIndex=0;pageIndex<100;pageIndex++){
   this.img = imageDatas[pageIndex];

   /* Create the Canvas element */
   let imgCanvasTmp = document.createElementNS("http://www.w3.org/1999/xhtml",'html:canvas');
   imgCanvasTmp.setAttribute('width', this.img.width);
   imgCanvasTmp.setAttribute('height', this.img.height);

   /* Import the image into the Canvas */
   imgCanvasTmp.getContext('2d').putImageData(this.img, 0, 0);

   /* Use the Canvas into another part of the program (Commented out for testing) */
  // this.displayCanvas(imgCanvasTmp,pageIndex);
  }

Изображения хорошо импортированы, но, похоже, произошла утечка памяти из-за функции putImageData.

При выходе из цикла «for» я ожидал, что память, выделенная для Canvas, будет освобождена, но, выполняя код без выполнения putImageData, я заметил, что моя программа в конце использует на 100 МБ меньше (мои изображения довольно большие ).

Я пришел к выводу, что функция putImageData предотвращает освобождение выделенной памяти сборщиком мусора.

Ты хоть представляешь, как заставить сборщик мусора освободить память? Есть ли способ очистить холст?

Я уже пытался удалить холст с помощью оператора delete или использовать функцию clearRect, но он ничего не сделал.

Я также пытался повторно использовать один и тот же холст для отображения изображения на каждой итерации, но объем используемой памяти не изменился, как если бы изображение было импортировано без удаления существующих ...

1 Ответ

0 голосов
/ 18 января 2011

Вы можете попробовать очистить холст после цикла. Глядя на ваш код, imgCanvasTmp все еще доступен и не может быть собран мусором. Обратите внимание, что вам может понадобиться дать браузеру простаивать в течение нескольких минут, прежде чем включится сборщик мусора. Также, возможно, вы захотите очистить imageDatas тоже.

...