Почему это использование утечки памяти getImageData
Я хотел бы выполнить некоторую обработку изображений с помощью Dart, используя requestAnimationFrame, чтобы постоянно обновлять изображение, которое я обрабатываю. Следующий код будет пропускать память до тех пор, пока в Dartium не произойдет сбой вкладки.
import 'dart:html';
import 'dart:async';
final CanvasElement m_canvas = querySelector("#canvas");
void main() {
scheduleMicrotask(requestRedraw);
}
void requestRedraw() {
if(true)
{
window.requestAnimationFrame(draw);
}
}
void draw(num _) {
var context = m_canvas.context2D;
context.clearRect(0, 0, m_canvas.width, m_canvas.height);
var imageData = context.getImageData(0, 0, m_canvas.width, m_canvas.height);
requestRedraw();
}
ImageData var явно выходит из области видимости после завершения каждого вызова отрисовки, но память, которую он сохраняет, никогда не освобождается. Комментирование этой строки приводит к тому, что код работает нормально и обновляется со скоростью 60 кадров в секунду. Эта утечка памяти - ошибка в текущей реализации дротика, или я делаю что-то не так?
1 ответ
Решение
Это очень странно, но когда я добавляю print()
Заявление к вашему коду, в которое вступает GC (по крайней мере, в Dartium)
int i = 0;
void draw(num _) {
var context = m_canvas.context2D;
context.clearRect(0, 0, m_canvas.width, m_canvas.height);
var imageData = context.getImageData(0, 0, m_canvas.width, m_canvas.height);
print(i++);
requestRedraw();
}