【问题标题】:Why does this use of getImageData leak memory为什么使用 getImageData 会泄漏内存
【发布时间】:2013-12-17 21:44:05
【问题描述】:

我想用 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 fps 更新。这个内存泄漏是当前飞镖实现中的一个错误还是我做错了什么?

【问题讨论】:

  • 不知道为什么,但似乎 Dartium 和/或 Dart VM 没有运行垃圾收集器。当使用 dart2js 并在 Firefox 中运行它时,我可以观察到内存使用率的上升和下降,正如预期的那样。所以不,看起来你做错了什么。

标签: memory-leaks dart dartium


【解决方案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();
}

【讨论】:

    猜你喜欢
    • 2015-07-12
    • 2011-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-09
    • 2011-05-12
    • 1970-01-01
    相关资源
    最近更新 更多