如何从arraybuffer中快速绘制像素到画布?

时间:2014-03-03 14:55:49

标签: javascript html5 canvas arraybuffer asm.js

我有一个asmjs模块,它适用于名为'MEM'的ArrayBuffer。每个循环都会调用重绘函数。在第一个'siz'字节中存储了像素颜色。我的代码有效,但运行缓慢。是否有可能以某种方式使它更快? arraybuffer不能是'siz'长度,因为模块可以在整个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);
};

1 个答案:

答案 0 :(得分: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));