WebAssembly数组传递(输入篇)

接着输出篇,接下来就讲输入的操作

*注意:在使用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)

附上类型对照表:

内存数组对应类型
HEAP8char*
HEAP16short int*
HEAP32int*
HEAPU8unsigned char*
HEAPU16unsigned short int*
HEAPU32unsigned int*
HEAPF32float*
HEAPF64double*

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

有问题可以相互帮助

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值