如何在不复制canvas imageData的情况下将其传递给emscripten c++程序
How to pass canvas imageData to emscripten c++ program without copying it?
我有画布的图像数据:
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()
仍然需要17ms才能执行。
c++函数原型是:
extern "C" {
int processImage(unsigned char *buffer, int width, int height)
{
}
}
有没有什么方法可以在不使用set()
的情况下将数组传递给C++?只是告诉c++数据在内存中的位置,并允许对其进行修改?
只是告诉c++数据在内存中的位置,并允许对其进行修改?
从v1.14.12开始,Emscripten有一个SPLIT_MEMBORY选项,您可以告诉Emscripten使用现有的缓冲区作为其内存空间的一部分,该内存空间被拆分为大小均匀的块
例如,您可以从画布中获取缓冲区
var existingBuffer = myImage.data.buffer;
var bufferSize = existingBuffer.byteLength; // Must be equal to SPLIT_MEMORY
然后,根据拆分内存的解释修改示例,告诉Emscripten将该缓冲区作为其内存空间的一部分
var chunkIndex = 2; // For example
allocateSplitChunk(chunkIndex, existingBuffer);
然后将指向块的指针传递给C++函数。
var pointerToImageInGlobalMemorySpace = chunkIndex * bufferSize;
_processImage(pointerToImageInGlobalMemorySpace, width, height);
但是存在问题和限制
- Emscripten内存空间必须划分为与画布图像数据缓冲区大小完全相同的块
- 显然,所有Emscripten编译的代码都会对性能产生严重影响,这可能会使其性能比原始代码差
相关文章:
- Mongodb c++驱动程序:如何查询元素的数组
- C++,系统无法执行指定的程序
- 在C++程序中输入的文本文件将不起作用,除非文本被复制和粘贴
- 在VS代码中交叉编译Windows与Linux上的MinGW的SDL程序
- C++ Windows 驱动程序MSB3030无法复制该文件,因为它找不到
- 重载操作程序时出错>>用于类中的字符串 memebr
- 获取日期异步信号安全吗?如果在信号处理程序中使用,它会导致死锁吗
- 试图在visual studio上用C++创建一个桌面应用程序
- 模板元程序查找相似的连续类型名称
- FFmpeg:制作一个应用程序比直接使用ffmepg更好吗
- 如何通过cpp程序运行shell脚本
- 有没有什么方法可以使用一个函数中定义的常量变量,也可以由c++中同一程序中的其他函数使用
- IPC使用多个管道和分支进程来运行Python程序
- 如何将c++程序的一些输出传递给shell,以便在shell中使用
- 使用C++程序合并排序没有得到正确的输出
- 基于boost的程序的静态链接——zlib问题
- 程序崩溃并显示"std::out_of_range"错误
- 在C应用程序中运行C++(带有STL)函数
- 如何在不复制canvas imageData的情况下将其传递给emscripten c++程序
- Emscripten应用程序未执行