我是靠谱客的博主 平常毛巾,最近开发中收集的这篇文章主要介绍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

有问题可以相互帮助

最后

以上就是平常毛巾为你收集整理的WebAssembly数组传递(输入篇)的全部内容,希望文章能够帮你解决WebAssembly数组传递(输入篇)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(42)

评论列表共有 0 条评论

立即
投稿
返回
顶部