概述
接着输出篇,接下来就讲输入的操作
*注意:在使用emscripten::val和emscripten::bind时,编译时要带上--bind参数
传统法:
JS:
var ptr = Module._malloc(myTypedArray.length * myTypedArray.BYTES_PER_ELEMENT);
Module.HEAPF64.set(myTypedArray, ptr); //HEAPF64是WebAssembly中double*的存储位置
Module.setValue(ptr * 8, myTypedArray.length); //8代表sizeof(double)
附上类型对照表:
内存数组 | 对应类型 |
---|---|
HEAP8 | char* |
HEAP16 | short int* |
HEAP32 | int* |
HEAPU8 | unsigned char* |
HEAPU16 | unsigned short int* |
HEAPU32 | unsigned int* |
HEAPF32 | float* |
HEAPF64 | double* |
C++:
#include <emscripten/val.h>
#include <emscripten/bind.h>
using namespace std;
using namespace emscripten;
void setValue(int ptr, int len){
double *data;
data = (double *)ptr;
for(int i = 0; i < len; i ++){
cout << data[i] <<endl;
}
}
优点:速度中等
缺点:需要JS端操作,比较麻烦
val class法:
JS:
Module.setValue(myTypedArray);
C++:
#include <emscripten/val.h>
#include <emscripten/bind.h>
using namespace std;
using namespace emscripten;
void setValue(val data){
for(int i = 0; i < len; i ++){
cout << data[i].as<double>() <<endl;
}
}
val通过as<type>方法可以将js数据转换为C++的原生类型
优点:js调用简单,整体直观
缺点:速度最慢
回归本质:
double *getDoublePtrFrom1XArray(val arr, int *len = NULL){
if(len == NULL) len = new int[1];
*len = arr["length"].as<int>();
double *ret = new double[*len];
val module = val::global("Module");
int ptr = (int)ret / sizeof(double);
module["HEAPF64"].call<val>("set", arr, val(ptr));
return ret;
}
优点:js调用简单,速度最快
缺点:暂时没发现
另:附上二维数组的解析
double **getDoublePtrFrom2XArray(val arr, int *y_len = NULL, int *x_len = NULL){
if(y_len == NULL) x_len = new int[1];
if(x_len == NULL) x_len = new int[1];
*y_len = arr["length"].as<int>();
val module = val::global("Module");
int ptr;
if(*y_len > 0){
*x_len = arr[0]["length"].as<int>();
double **ret = new double*[*y_len];
for(int i = 0; i < *y_len; i ++){
ret[i] = new double[*x_len];
ptr = (int)ret[i] / sizeof(double);
module["HEAPF64"].call<val>("set", arr[i], val(ptr));
}
return ret;
} else {
*x_len = 0;
return NULL;
}
}
因为目前还没有wasm的群,所以自己建了个:866749590
有问题可以相互帮助
最后
以上就是平常毛巾为你收集整理的WebAssembly数组传递(输入篇)的全部内容,希望文章能够帮你解决WebAssembly数组传递(输入篇)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复