утечка памяти javascript с HTML5 getImageData

Я работал над попыткой сделать некоторые визуальные эффекты для игры javascript, которую я создаю, и я заметил, что кусок кода, который я использую для модуляции цвета моих спрайтов, заставляет использование памяти браузеров расти и расти, казалось бы, без ограничений.

вы можете увидеть код и утечку памяти здесь: http://timzook.tk/javascript/test.html

эта утечка памяти происходит только в моей функции updateimage (), когда я вызываю getImageData из моего контекст холста каждый кадр (через setInterval), чтобы сделать новый объект ImageData перекрасить. Я бы подумал, что сборщик мусора javascript будет уничтожать старый, но если нет, я понятия не имею, как уничтожить его вручную. Любая помощь в выяснении, почему он это делает или как это исправить, будет оценена по достоинству.

мой вопрос очень похож на этот: что такое утечка памяти с использованием getImageData, javascript, HTML5 canvas однако мне нужен мой код чтобы запустить каждый кадр в functioned, вызванный setInterval, его решение переместить его за пределы функции setInterval не является для меня вариантом, и я не могу оставить комментарий, спрашивающий, нашел ли он какой-то другой метод его решения.

Примечание для людей, тестирующих его: поскольку в этом примере используется getImageData, его нельзя протестировать локально, просто бросив его в a .HTML-файл, требуется веб-сервер. Также он явно использует элементы HTML5, поэтому некоторые браузеры не будут работать с он.

Edit: * решено* спасибо, Решение ниже исправил. Я не понимал, что вы можете использовать элемент canvas так же, как вы можете использовать изображение в drawImage (), я реструктурировал свой код, поэтому теперь он использует значительно меньше памяти. Я загрузил этот измененный код на страницу, связанную выше, если кто-то хочет его увидеть.

1 ответов


вы не получаете утечку памяти из разговоров getImageData(). Источник вашей проблемы-эта строка:

TempImg.src = ImgCanvas.toDataURL("image/png");

эффективно, каждый раз, когда код выполняется в браузере "загрузки" другое изображение и сохраняет его в памяти. Таким образом, то, что вы на самом деле в конечном итоге кэш, который растет очень быстро. Вы можете легко проверить это, открыв сайт в Chrome и проверив вкладку ресурсы инструментов разработчика (ctrl+shift+i).

вы может обойти это, сделав TempImgCanvas и сохранение данных изображения на этом холсте вместо того, чтобы обновлять объект изображения после каждого вызова вашего updateimage() петли.


Edit: я немного реструктурировал вещи и устранил проблему кэширования. Вам просто нужно внести два изменения. Первый заменяет ваш