@echo off setlocal enabledelayedexpansion echo ======================================== echo WASM to asm.js 转换器 echo ======================================== echo. :: 检查参数 if "%~1"=="" ( echo 错误: 缺少 WASM 文件路径参数 echo. echo 用法: gen-asm.bat ^ ^<输出路径^> echo. echo 示例: echo gen-asm.bat pinball.wasm output/pinball-asm.js echo gen-asm.bat ../target/wasm32-unknown-unknown/release/pinball_physics.wasm ../client-cocos/assets/wasm/pinball-asm.js echo. goto :error ) if "%~2"=="" ( echo 错误: 缺少输出路径参数 echo. echo 用法: gen-asm.bat ^ ^<输出路径^> echo. goto :error ) set WASM_FILE=%~1 set OUTPUT_FILE=%~2 set SCRIPT_DIR=%~dp0 :: 转换为绝对路径 for %%i in ("%WASM_FILE%") do set WASM_FILE_ABS=%%~fi for %%i in ("%OUTPUT_FILE%") do set OUTPUT_FILE_ABS=%%~fi for %%i in ("%OUTPUT_FILE_ABS%") do set OUTPUT_DIR=%%~dpi :: 检查输入文件是否存在 if not exist "%WASM_FILE_ABS%" ( echo 错误: WASM 文件不存在: %WASM_FILE_ABS% goto :error ) :: 创建输出目录(如果不存在) if not exist "%OUTPUT_DIR%" ( echo 创建输出目录: %OUTPUT_DIR% mkdir "%OUTPUT_DIR%" ) echo 输入文件: %WASM_FILE_ABS% echo 输出文件: %OUTPUT_FILE_ABS% echo. :: 检查 Emscripten 环境 call emcc --version >nul 2>&1 if %errorlevel% neq 0 ( echo Emscripten 环境未设置,尝试自动设置... if exist "%SCRIPT_DIR%emsdk\emsdk_env.bat" ( echo 运行 Emscripten 环境设置... call "%SCRIPT_DIR%emsdk\emsdk_env.bat" call emcc --version >nul 2>&1 if %errorlevel% neq 0 ( echo 错误: 无法设置 Emscripten 环境 echo 请先运行 install.bat 安装 Emscripten,或手动运行 setup-env.bat goto :error ) ) else ( echo 错误: 未找到 Emscripten 安装 echo 请先运行 install.bat 安装 Emscripten goto :error ) ) echo Emscripten 版本信息: call emcc --version | findstr "emcc" echo. echo 开始转换 WASM 到 asm.js... :: 使用 emcc 将 WASM 转换为 asm.js :: 关键参数说明: :: -s WASM=0 : 禁用 WebAssembly,生成 asm.js :: -s LEGACY_VM_SUPPORT=1 : 支持较老的 JavaScript 引擎 :: -s ALLOW_MEMORY_GROWTH=1 : 允许内存增长 :: -s NO_EXIT_RUNTIME=1 : 不退出运行时 :: -s EXPORTED_FUNCTIONS=["_main"] : 导出函数(根据需要调整) :: -s MODULARIZE=1 : 生成模块化代码 :: -s EXPORT_NAME="Module" : 导出模块名 :: -O3 : 最高优化级别 call emcc "%WASM_FILE_ABS%" ^ -s WASM=0 ^ -s LEGACY_VM_SUPPORT=1 ^ -s ALLOW_MEMORY_GROWTH=1 ^ -s NO_EXIT_RUNTIME=1 ^ -s MODULARIZE=1 ^ -s EXPORT_NAME="PinballModule" ^ -s EXPORTED_RUNTIME_METHODS="['ccall','cwrap']" ^ -O3 ^ --closure 0 ^ -o "%OUTPUT_FILE_ABS%" if %errorlevel% neq 0 ( echo 错误: 转换失败 goto :error ) echo. echo ======================================== echo 转换成功! echo ======================================== echo. echo 输出文件: %OUTPUT_FILE_ABS% :: 显示文件大小 for %%A in ("%OUTPUT_FILE_ABS%") do ( set file_size=%%~zA set /a size_kb=!file_size!/1024 echo 文件大小: !size_kb! KB ) echo. echo 使用方法: echo 在 HTML 中引入生成的 JS 文件,然后使用: echo PinballModule().then(function(Module) { echo // 使用 Module.ccall 调用导出的函数 echo var result = Module.ccall('function_name', 'number', ['number'], [42]); echo }); echo. goto :end :error echo. echo 转换失败! exit /b 1 :end pause