前几天参加有奖征文,发了一篇关于开发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里做的测试。
最后,再总结一下:
- 如果只是小数据小逻辑的处理,直接用ts或js即可,反而更快一些,用wasm显得多余,而且因为与wasm进行多次交互的原因,效率反而有所下降。
- 对大量数据,大量逻辑的话,推荐用wasm,包括但不限于用rust去开发,因为wasm本身是在更底层的地方执行您的代码,如果您是个追求极限的开发者,建议您考虑考虑。
- 对MD5的使用只是一个引子,您也可以用它很简单来实现对一些复杂算法的使用。也可以对一些原来需要大量计算的优化。
建议可以用wasm来优化的地方:
- 游戏里经常用到的寻路算法,例如A星或优化之类。
- 这两年来,由吸血鬼幸存者拉起的一场割草游戏的狂潮,在游戏场景中,需要对碰撞算法的优化,也是可以使用wasm来优化的。通过将rust与cocoscreator的绑定,甚至你可以将整个战斗都放在wasm里面,获得最高的效率的同时,也可以实现在原生端的热更底层代码,一举多得。
- 游戏在与服务器通讯的过程中,对通讯协议内容的加解密,这块应该也是挺好用的,一来是一定程度的隐藏了加解密的算法,二来更快地完成这块复杂的程序。
当然,这也只是我目前认为比较有用的优化想法。如果大家有什么优化的想法,希望可以在下面跟贴讨论下或者是跟大家分享分享。让我们一起为游戏开发的发展,做多一点点贡献。
不了解如何在cocoscreator中使用rust开发的wasm,可以看下这篇文章 V7投稿|如何在项目中开发并使用WebAssembly(WASM)来了,基础的开发流程官方资料讲得挺清晰的,而将wasm用到creator中来的关键步骤,照着我的文章中写的流程来操作就可以顺利完成整个桥接。非常方便。