Creator 3.4.1 无法正确加载Wasm文件

wasm_module.zip (9.9 KB)

  • Creator 版本:3.4.1

  • 目标平台: Edge 浏览器

  • 重现方式:

  1. 新建HelloWorld项目;

  2. 拷贝hello3.js, hello3.wasm 文件到项目Asset/wasm_module目录,并把helle3.js勾选 “导入为插件” (这些文件在附件中)
    image

我是cocos creator新手,接触cc不到3天;对 js 和 creator都不熟悉,按以前的经验做的,请多指教!
描述一下我用wasm的目的: 想用材质的方式实现战场迷雾,因为要频繁更新纹理信息并计算,希望启动一个工作线程做这些操作,然后在某个恰当的时机传递纹理给材质。迷雾的效果和思路参考: Unity3D游戏高性能战争迷雾系统实现 - SChivas - 博客园 (cnblogs.com)

我还想请教一个问题,c++侧引用直接写纹理和设置材质属性相关头文件在哪?

抱歉,目前 Creator 没有一键支持 WASM(Emscripten)的方式。

假设 WASM 模块由 Emscripten 生成,它由一个 .js 和一个相应的 .wasm 组成,我建议你通过如下步骤使用 WASM:

  1. 确保你的 .wasm 文件在 assets/ 目录下。

  2. 如果你的 .js 文件在 assets/ 目录下,确保它 没有 被勾选为插件脚本。

    注意,我们不再推荐插件脚本。

  3. 在其它模块中用 ESM 标准语法导入 .js 文件,例如 import factory from '到 .js 的路径'。请注意此处没有中括号。

  4. 在合适的地方,使用 Creator 资源加载 API,以 Uint8Array 的方式加载 .wasm 文件。随后,用该 Uint8Array 对象调用 Ecmascripten 模块函数。举例:

    import factory from '到 .js 的路径';
    import { assetManager, BufferAsset } from 'cc';
    async function loadWasm() {
       // 某个异步函数体内
    
       // 以 Uint8Array 的形式加载 .wasm 文件
       const wasmBinary = await new Promise<Uint8Array>((resolve, reject) => {
        assetManager.loadAny<BufferAsset>('.wasm 的 UUID', (error, asset) => {
            if (error) {
                reject(error);
            } else {
                resolve(new Uint8Array(asset.buffer()!));
            }
        });
    
        // 调用 Emscripten 模块函数
        const module = await factory({
          wasmBinary,
        });
    
        // 你初始化好的 Emscripten 模块
        return module;
    });
    }
    

关于 Emscripten 模块参数以及 wasmBinary,见:

3赞

你这个代码真的能加载成BufferAsset么?你试过了么?wasm后缀的文件能被识别成BufferAsset?你们不是只能要求bin后缀才能是二进制的么?反正我是没加载成功!

1赞

不好意思,忘了讲了,得把它名称改成 .bin 后缀

1赞

该主题在最后一个回复创建后14天后自动关闭。不再允许新的回复。