【发布时间】:2017-03-06 12:02:59
【问题描述】:
我收到了带有 RGBA 值的Uint8Array,以及图像的哪些部分已更新的一些信息。将这个原始位图信息渲染回画布的最快方法是什么?我一直在使用 2D 渲染上下文手动循环数组并设置像素信息,但这非常慢:
let imageData = new ImageData(1920, 1080);
for (var i=0;i < args.frameBuffer.length; i+=4) {
imageData.data[i] = args.frameBuffer[i];
imageData.data[i+1] = args.frameBuffer[i+1];
imageData.data[i+2] = args.frameBuffer[i+2];
imageData.data[i+3] = args.frameBuffer[i+3];
}
context.putImageData(imageData, 0, 0, args.dirtyX, args.dirtyY, args.dirtyWidth, args.dirtyHeight);
什么是更有效的方法来做到这一点? WebGL 会比 2D 上下文更高效吗?原生还是通过 Three.js 之类的东西?
【问题讨论】:
-
看看textures。特别是 texImage2D 方法。
-
要在类型数组之间移动数据,您可以使用
imageDataTo.data.set(imageDataFrom.data)要复制部分数据(矩形),请使用set和subArray移动行。对于每一行(imageData 是 id)idTo.data.set(idFrom.data.subArray((yFrom*idFrom.width+xFrom)*4,width),(yTo*idTo.width+xTo)*4)如果您需要检查每个像素,您可以创建一个 Uint32Array 以使用data32 = new Uint32Array(imageData.data.buffer)在一次读取/写入中处理一个像素@ 注意小/大端开始发挥作用。画布也是一个图像,因此您可以将context.drawImage(canvasFrom,...从画布渲染到画布
标签: javascript canvas webgl