Date: Sun, 02 Jan 2011 04:59:14 -0600 From: Boris Zbarsky <bzbar...@mit.edu> On 1/1/11 6:53 PM, Charles Pritchard wrote:
>  ArrayBuffer and Canvas use contiguous memory segments. You don't need a
>  complex GC pass to let those ones go.
Yes, you do.  You can't let go of the canvas buffer without letting go
of the canvas rendering contexts and canvas elements referencing it.
And those used to be referenced from JS, so the only way they can go
away is via a GC.

Similar for ArrayBuffer: the memory segment is owned by various
garbage-collected objects, and can't go away until they do.
With canvas, you can just set canvas.width = 1; to let the memory go, without a complex GC.
canvas.width = 1 can be used to quickly release several megs of ram.

On that note, a method of invalidating ArrayBufferView and CanvasPixelArray would be helpful in the future. Maybe that's something we could talk about, as we discuss the feasibility of responding to lowmemory events.

Here's a thread considering .close() as an invalidate method name:
http://www.khronos.org/webgl/public-mailing-list/archives/1009/msg00229.html

And here's a quick attempt at example, on my part:

el.onclick = function() {
  imageData.close();
  worker.postMessage(imageData);
// imageData.data[0] = 0; now throws INVALID_STATE_ERR from this thread
}

.close() signals to postMessage to use a pointer, instead of cloning the object.











Reply via email to