完善发布asm.js脚本

This commit is contained in:
janing
2025-11-29 01:42:48 +08:00
parent 8c7f70ae9b
commit e8a07c695e
11 changed files with 202 additions and 157 deletions

View File

@@ -21,7 +21,7 @@ export class WasmPhysicsEngine implements IPhysicsEngine {
* @param settings 物理设置
* @param wasmFactory WASM工厂函数可选推荐使用
*/
async initialize(settings: PhysicsSettings, wasmFactory?: any): Promise<void> {
async initialize(settings: PhysicsSettings ): Promise<void> {
if (this.state === WasmModuleState.LOADED) {
return;
}
@@ -29,15 +29,7 @@ export class WasmPhysicsEngine implements IPhysicsEngine {
this.state = WasmModuleState.LOADING;
try {
if (wasmFactory) {
// 使用新的 WasmLoader推荐方式
await this.initializeWithWasmLoader(wasmFactory);
} else {
// 回退到旧的加载方式(保持向后兼容)
console.warn('使用旧的 WASM 加载方式,推荐提供 wasmFactory 参数使用 WasmLoader');
await this.initializeLegacy();
}
await this.initializeLegacy();
this.state = WasmModuleState.LOADED;
console.log('WASM Physics Engine initialized successfully');
@@ -102,8 +94,18 @@ export class WasmPhysicsEngine implements IPhysicsEngine {
*/
private async initializeLegacy(): Promise<void> {
// 加载 WASM 文件
const wasmPath = 'assets/wasm/pinball_physics.wasm';
const wasmResponse = await fetch(wasmPath);
const result = await wasmLoader.loadWasmWithAsmFallback(
wasmFactory, // WASM 工厂函数
asmFactory, // ASM 工厂函数
'pinball_physics.wasm', // WASM 文件名
'pinball_physics.asm.mem', // ASM 内存文件名
'44cacb3c-e901-455d-b3e1-1c38a69718e1', // WASM UUID
'3400003e-dc3c-43c1-8757-3e082429125a', // ASM UUID
'wasmFiles' // Bundle 名称
);
console.log('模块加载成功,使用的是:', result.isWasm ? 'WASM' : 'ASM');
console.log('模块实例:', result.instance);
if (!wasmResponse.ok) {
throw new Error(`Failed to fetch WASM file: ${wasmResponse.statusText}`);

View File

@@ -0,0 +1,9 @@
{
"ver": "4.0.23",
"importer": "typescript",
"imported": true,
"uuid": "c244f34a-30ab-4c13-ad52-9660a71d9cc4",
"files": [],
"subMetas": {},
"userData": {}
}

View File

@@ -0,0 +1,9 @@
{
"ver": "4.0.23",
"importer": "typescript",
"imported": true,
"uuid": "005f083e-a7f9-483a-bc2c-cec96e4098c0",
"files": [],
"subMetas": {},
"userData": {}
}

Binary file not shown.

View File

@@ -0,0 +1,9 @@
{
"ver": "4.0.23",
"importer": "javascript",
"imported": true,
"uuid": "1205a156-e26f-489c-acc2-274040636dfd",
"files": [],
"subMetas": {},
"userData": {}
}

Binary file not shown.

View File

@@ -0,0 +1,12 @@
{
"ver": "1.0.3",
"importer": "buffer",
"imported": true,
"uuid": "b209ab60-b43e-4dda-b9a9-401e28fd8735",
"files": [
".bin",
".json"
],
"subMetas": {},
"userData": {}
}

View File

@@ -2,163 +2,163 @@
setlocal enabledelayedexpansion
echo ========================================
echo Pinball Physics 构建脚本
echo Pinball Physics 构建脚本
echo ========================================
echo.
:: 设置构建模式,默认为 debug
:: 设置构建模式,默认为 debug
set BUILD_MODE=%1
if "%BUILD_MODE%"=="" set BUILD_MODE=debug
:: 验证构建模式
:: 验证构建模式
if /i "%BUILD_MODE%" neq "debug" if /i "%BUILD_MODE%" neq "release" (
echo 错误: 无效的构建模式 "%BUILD_MODE%"
echo 支持的模式: debug ^| release
echo 错误: 无效的构建模式 "%BUILD_MODE%"
echo 支持的模式: debug ^| release
echo.
echo 用法: build-physics.bat [debug^|release]
echo 示例: build-physics.bat release
echo 用法: build-physics.bat [debug^|release]
echo 示例: build-physics.bat release
goto :error
)
echo 构建模式: %BUILD_MODE%
echo 构建模式: %BUILD_MODE%
echo.
:: 设置路径变量
:: 设置路径变量
set SCRIPT_DIR=%~dp0
set PROJECT_ROOT=%SCRIPT_DIR%..\
set PHYSICS_DIR=%PROJECT_ROOT%pinball-physics
set TARGET_DIR=%PHYSICS_DIR%\target\wasm32-unknown-unknown\%BUILD_MODE%
set WASM_SOURCE=%TARGET_DIR%\pinball_physics.wasm
set WASM_OUTPUT=%SCRIPT_DIR%assets\wasm\pinball_physics.bin
set ASM_OUTPUT=%SCRIPT_DIR%assets\wasm\pinball_physics.js
set ASM_OUTPUT=%SCRIPT_DIR%assets\wasm\pinball_physics.asm.js
set EMSCRIPTEN_TOOL=%PROJECT_ROOT%tools\emscripten\gen-asm.bat
echo 路径配置:
echo 物理引擎目录: %PHYSICS_DIR%
echo WASM 源文件: %WASM_SOURCE%
echo WASM 输出: %WASM_OUTPUT%
echo asm.js 输出: %ASM_OUTPUT%
echo 路径配置:
echo 物理引擎目录: %PHYSICS_DIR%
echo WASM 源文件: %WASM_SOURCE%
echo WASM 输出: %WASM_OUTPUT%
echo asm.js 输出: %ASM_OUTPUT%
echo.
:: 检查物理引擎项目是否存在
:: 检查物理引擎项目是否存在
if not exist "%PHYSICS_DIR%\Cargo.toml" (
echo 错误: 未找到物理引擎项目
echo 路径: %PHYSICS_DIR%
echo 错误: 未找到物理引擎项目
echo 路径: %PHYSICS_DIR%
goto :error
)
:: 检查 Rust 是否安装
:: 检查 Rust 是否安装
rustc --version >nul 2>&1
if %errorlevel% neq 0 (
echo 错误: 未找到 Rust 编译器
echo 请先安装 Rust: https://rustup.rs/
echo 错误: 未找到 Rust 编译器
echo 请先安装 Rust: https://rustup.rs/
goto :error
)
:: 检查 wasm32-unknown-unknown 目标是否安装
:: 检查 wasm32-unknown-unknown 目标是否安装
rustup target list --installed | findstr "wasm32-unknown-unknown" >nul 2>&1
if %errorlevel% neq 0 (
echo 安装 wasm32-unknown-unknown 目标...
echo 安装 wasm32-unknown-unknown 目标...
rustup target add wasm32-unknown-unknown
if %errorlevel% neq 0 (
echo 错误: 安装 wasm32-unknown-unknown 目标失败
echo 错误: 安装 wasm32-unknown-unknown 目标失败
goto :error
)
)
:: 创建输出目录
:: 创建输出目录
if not exist "%SCRIPT_DIR%assets\wasm" (
echo 创建输出目录: assets\wasm
echo 创建输出目录: assets\wasm
mkdir "%SCRIPT_DIR%assets\wasm"
)
echo ----------------------------------------
echo 第1步: 编译物理引擎 (模式: %BUILD_MODE%)
echo 第1步: 编译物理引擎 (模式: %BUILD_MODE%)
echo ----------------------------------------
echo.
:: 切换到物理引擎目录并编译
:: 切换到物理引擎目录并编译
cd /d "%PHYSICS_DIR%"
if /i "%BUILD_MODE%"=="release" (
echo 执行命令: cargo build --target wasm32-unknown-unknown --release
echo 执行命令: cargo build --target wasm32-unknown-unknown --release
cargo build --target wasm32-unknown-unknown --release
) else (
echo 执行命令: cargo build --target wasm32-unknown-unknown
echo 执行命令: cargo build --target wasm32-unknown-unknown
cargo build --target wasm32-unknown-unknown
)
if %errorlevel% neq 0 (
echo 错误: 物理引擎编译失败
echo 错误: 物理引擎编译失败
goto :error
)
:: 检查编译输出是否存在
:: 检查编译输出是否存在
if not exist "%WASM_SOURCE%" (
echo 错误: 编译输出文件不存在
echo 期望位置: %WASM_SOURCE%
echo 错误: 编译输出文件不存在
echo 期望位置: %WASM_SOURCE%
goto :error
)
:: 显示编译结果信息
:: 显示编译结果信息
for %%A in ("%WASM_SOURCE%") do (
set source_size=%%~zA
set /a size_kb=!source_size!/1024
echo 编译成功! 文件大小: !size_kb! KB
echo 编译成功! 文件大小: !size_kb! KB
)
echo.
echo ----------------------------------------
echo 第2步: 拷贝 WASM 文件
echo 第2步: 拷贝 WASM 文件
echo ----------------------------------------
echo.
:: 拷贝 WASM 文件到客户端资源目录
echo 拷贝: %WASM_SOURCE%
echo 到: %WASM_OUTPUT%
:: 拷贝 WASM 文件到客户端资源目录
echo 拷贝: %WASM_SOURCE%
echo 到: %WASM_OUTPUT%
copy "%WASM_SOURCE%" "%WASM_OUTPUT%" >nul
if %errorlevel% neq 0 (
echo 错误: 拷贝 WASM 文件失败
echo 错误: 拷贝 WASM 文件失败
goto :error
)
echo 拷贝成功!
echo 拷贝成功!
echo.
echo ----------------------------------------
echo 第3步: 生成 asm.js 文件
echo 第3步: 生成 asm.js 文件
echo ----------------------------------------
echo.
:: 检查 Emscripten 转换工具是否存在
:: 检查 Emscripten 转换工具是否存在
if not exist "%EMSCRIPTEN_TOOL%" (
echo 错误: 未找到 Emscripten 转换工具
echo 路径: %EMSCRIPTEN_TOOL%
echo 请先运行: tools\emscripten\install.bat
echo 错误: 未找到 Emscripten 转换工具
echo 路径: %EMSCRIPTEN_TOOL%
echo 请先运行: tools\emscripten\install.bat
goto :error
)
:: 切换回项目根目录
:: 切换回项目根目录
cd /d "%PROJECT_ROOT%"
:: 执行 WASM 到 asm.js 转换
echo 执行转换: WASM → asm.js
echo 命令: %EMSCRIPTEN_TOOL% "%WASM_SOURCE%" "%ASM_OUTPUT%"
:: 执行 WASM 到 asm.js 转换
echo 执行转换: WASM → asm.js
echo 命令: %EMSCRIPTEN_TOOL% "%WASM_SOURCE%" "%ASM_OUTPUT%"
echo.
call "%EMSCRIPTEN_TOOL%" "%WASM_SOURCE%" "%ASM_OUTPUT%"
if %errorlevel% neq 0 (
echo 错误: asm.js 转换失败
echo 错误: asm.js 转换失败
goto :error
)
echo.
echo ========================================
echo 构建完成!
echo 构建完成!
echo ========================================
echo.
echo 输出文件:
echo 输出文件:
echo WASM: %WASM_OUTPUT%
if exist "%ASM_OUTPUT%" (
for %%A in ("%WASM_OUTPUT%") do (
@@ -171,20 +171,20 @@ if exist "%ASM_OUTPUT%" (
)
echo asm.js: %ASM_OUTPUT%
echo.
echo 文件大小:
echo 文件大小:
echo WASM: !wasm_kb! KB
echo asm.js: !asm_kb! KB
)
echo.
echo 构建模式: %BUILD_MODE%
echo 可以在 Cocos Creator 中使用这些文件了!
echo 构建模式: %BUILD_MODE%
echo 可以在 Cocos Creator 中使用这些文件了!
goto :end
:error
echo.
echo ========================================
echo 构建失败!
echo 构建失败!
echo ========================================
exit /b 1