用RUST开发WASM实例:使用MD5

前几天参加有奖征文,发了一篇关于开发wasm的流程。V7投稿|如何在项目中开发并使用WebAssembly(WASM)来了
事后回去看看,发现写得还是有点枯燥,如果是我看一个新东西的话,更喜欢会看点实例。
所以打算后面写几个实例,对该文章进行补充,也希望有更多喜欢开发的朋友可以加入进来一起玩。
今天先写一个使用rust的md5库,对一个字符串进行md5处理。
具体的wasm开发流程大家可以对照着投稿文章去做,就可以顺利地去创建一个给cocoscreator使用wasm。

这里只说怎么添加一个md5的库,并在creator中使用。再做下简单的对比测试。

首先,我们先给用来开发wasm的rust项目添加一个md5库

  cargo add md5

也可以直接在Cargo.toml里面手动添加一个md5的库(目前最新版本是0.7.0)

  [dependencies]
  md5 = "0.7.0"

其次,写一个md5的使用方法,并将它标记为导出成wasm方法

#[wasm_bindgen]
pub fn md5(input: &str) -> JsString {
    JsString::from(format!("{:x}", md5::compute(input)))
}

然后,导出wasm到cocoscreator的项目中,然后在ts对应调用

  import { md5 } from "../pkg/kkwasm_lib";    // 在ts中引入上面导出的wasm
  // 使用
  let content = "abcdefghijklmn1234567890";
  let out = md5(content);
  console.log(out);

在cocoscreator调用wasm就是这么简单,透过这个实例,我们可以认为,大部分rust的纯算法,是可以直接用在wasm中的,这样给我们做开发提供很大的便利。

当然也有些rust库是不允许导出给Wasm使用的,因为它们绑定了不同的平台,有一些处理在wasm中是编译不通过的。
判断某个库能不能用也很简单,一种方法是看下介绍文档,另外一个方法就是直接引用该库,然后使用对应的接口,编译通过就基本上能用。
用laya引擎开发的同学,有wasm使用需要的话,这个方案应该也是可行的,除非laya引擎对wasm做了限制。

接着我们来做一下简单的测试,在ts中也引入一个md5库,然后跟wasm的md5做下对比。

引用一个md5的js库。MD5Coder.zip (2.2 KB)
写一个测试的方法

test_func(count: number, arg1: () => void) {
    const t1 = Date.now();
    for (var i = 0; i < count; i++) {
        arg1();
    }
    console.log('测试' + count + '次使用时间:', Date.now() - t1, "毫秒");
}

随机生成一大串字符串

const content_arr = [], count = 100;
for(var i = 0; i < count; i++) {
    content_arr.push(Math.random().toString());
}
const content = content_arr.join("");

ts调用js库的md5,测试10万次

const md5coder = new MD5Coder();
this.test_func(100000, () => {
    md5coder.md5(content);
});

ts调用wasm的md5,测试10万次

this.test_func(100000, () => {
    md5(content);
});

两个的测试结果,这里是在chrome里做的测试。
image

最后,再总结一下:

  1. 如果只是小数据小逻辑的处理,直接用ts或js即可,反而更快一些,用wasm显得多余,而且因为与wasm进行多次交互的原因,效率反而有所下降。
  2. 对大量数据,大量逻辑的话,推荐用wasm,包括但不限于用rust去开发,因为wasm本身是在更底层的地方执行您的代码,如果您是个追求极限的开发者,建议您考虑考虑。
  3. 对MD5的使用只是一个引子,您也可以用它很简单来实现对一些复杂算法的使用。也可以对一些原来需要大量计算的优化。

建议可以用wasm来优化的地方:

  1. 游戏里经常用到的寻路算法,例如A星或优化之类。
  2. 这两年来,由吸血鬼幸存者拉起的一场割草游戏的狂潮,在游戏场景中,需要对碰撞算法的优化,也是可以使用wasm来优化的。通过将rust与cocoscreator的绑定,甚至你可以将整个战斗都放在wasm里面,获得最高的效率的同时,也可以实现在原生端的热更底层代码,一举多得。
  3. 游戏在与服务器通讯的过程中,对通讯协议内容的加解密,这块应该也是挺好用的,一来是一定程度的隐藏了加解密的算法,二来更快地完成这块复杂的程序。

当然,这也只是我目前认为比较有用的优化想法。如果大家有什么优化的想法,希望可以在下面跟贴讨论下或者是跟大家分享分享。让我们一起为游戏开发的发展,做多一点点贡献。

不了解如何在cocoscreator中使用rust开发的wasm,可以看下这篇文章 V7投稿|如何在项目中开发并使用WebAssembly(WASM)来了,基础的开发流程官方资料讲得挺清晰的,而将wasm用到creator中来的关键步骤,照着我的文章中写的流程来操作就可以顺利完成整个桥接。非常方便。

4赞

image
补份安卓环境下的测试

2赞

确实提升巨大

:smile: 是的,主要是wasm能用起来了,用rust开发也方便,有一堆现成的库拿过来就用。还能一定程度解决现在很多微信或抖音小游戏的js代码给反编译的问题。

没有排除算法差异,应该把ts的代码用rust实现再对比一下

嗯,核心就算是一样的,写法上也会有所差异。
严谨的做法就是把一个ts算法一对一翻译成wasm去做对比测试。