2

我有一个 asmjs 模块,它适用于一个ArrayBuffer名为“MEM”的模块。在每个循环中都会调用 repaint 函数。在第一个“大小”字节中是存储的像素颜色。我的代码有效,但运行缓慢。是否有可能以某种方式使其更快?数组缓冲区不能是“大小”长度,因为该模块适用于整个 ArrayBuffer。

var MEM = new ArrayBuffer(2*1024*1024);
var MEMU8 = new Uint8Array(MEM);
var imgData=ctx.createImageData(canvas.width,canvas.height);
var siz = (canvas.width*canvas.height*4)|0;

var rePaint = function() {
    var i=0;

    module.repaint();

    i=siz;
    while(i--) {
        imgData.data[i] = MEMU8[i];
    }

    ctx.putImageData(imgData, 0, 0);
    requestAnimationFrame(rePaint);
};
4

1 回答 1

3

您可以通过使用类型化数组的 .set 方法获得性能:

不幸的是,IE 仍然使用 CanvasPixelArray 而不是新的 html 规范 (Uint8ClampedArray)。IE 的 imageData.data 还没有 .set 方法。

但是您仍然可以使用 .set 间接使用转换数组:

// create a typed array to pipe data through
// (used to be able to do .set later)

buffer = new ArrayBuffer(imgData.data.length);

converterArray=new Uint8Array(buffer);

// In repaint

imgData.data = converterArray.set(MEMU8.subarray(0,siz));
于 2014-03-03T20:45:19.117 回答