2013-12-17 129 views
2

我想用Dart做一些圖像處理,同時使用requestAnimationFrame來不斷更新我正在處理的圖像。下面的代碼會泄漏內存,直到Dartium中的選項卡崩潰。爲什麼使用getImageData泄漏內存

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更新。這個內存泄漏了當前dart實現中的錯誤還是我做錯了什麼?

+0

不知道爲什麼,但似乎Dartium和/或飛鏢VM沒有按」運行垃圾收集器。當使用dart2js並在Firefox中運行它時,我可以像預期的那樣觀察內存使用情況。所以不,看起來不像你做錯了什麼。 – MarioP

回答

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(); 
}