【发布时间】:2015-12-16 09:00:27
【问题描述】:
我有画布的图像数据:
myImage = ctx.getImageData(0, 0, 640, 480);
我发现,我可以创建新的Uint8Array 并使用set() 来复制图像数据。这是工作示例:
var numBytes = width * height * 4;
var ptr= Module._malloc(numBytes);
var heapBytes= new Uint8Array(Module.HEAPU8.buffer, ptr, numBytes);
heapBytes.set(new Uint8Array(myImage.data));
_processImage(heapBytes.byteOffset, width, height);
myImage.data.set(heapBytes);
但是,不幸的是,每个.set()的操作都比处理图像慢得多,而且上面的代码比JS实现要慢!
所以,我想处理图像而不复制它。我可以通过这种方式成功地将数据直接读写到堆中:
Module.HEAPU8.set(myImage.data, myImage.data.byteOffset);
_processImage(myImage.data.byteOffset, width, height);
myImage.data.set(new Uint8ClampedArray(Module.HEAPU8.buffer , myImage.data.byteOffset , numBytes));
它更快,但第一个 .set() 仍然需要 17 毫秒才能执行。
c++函数原型为:
extern "C" {
int processImage(unsigned char *buffer, int width, int height)
{
}
}
有没有办法在不使用set() 的情况下将数组传递给C++?只是告诉 c++ 数据在内存中的位置,并允许修改它?
【问题讨论】:
-
这是在什么浏览器/操作系统/系统规格上运行的?在内存中复制一张 640x480 的图像需要 17ms 有点长...
-
Chrome 46 / Windows 7 64bit / Xeon E31235 @ 3.20 GHz / 8 GB。在 firefox set() 上要快得多,但 emcescript asm.js 的工作速度较慢...
标签: javascript c++ canvas emscripten asm.js