У меня есть данные изображения холста:Как передать canvas imageData в программу emscripten C++ без копирования?
myImage = ctx.getImageData(0, 0, 640, 480);
Я понял, что я могу создать новую Uint8Array
и использовать set()
скопировать ImageData. Это рабочий пример:
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()
принимает 17ms выполнить.
C++ прототип функции:
extern "C" {
int processImage(unsigned char *buffer, int width, int height)
{
}
}
Есть ли способ, чтобы передать массив в C++ без использования set()
? Просто сообщите C++, где данные находятся в памяти, и разрешите его изменить?
Какие характеристики браузера/ОС/системы работают? 17 мс немного длиннее для копирования изображения 640x480 в память ... –
Chrome 46/Windows 7 64bit/Xeon E31235 @ 3.20 ГГц/8 ГБ. В firefox set() намного быстрее, но emcescript asm.js работает медленнее ... –