43 lines
2.8 KiB
Markdown
43 lines
2.8 KiB
Markdown
# HybridCLR Gen All 与 WebGL 原生构建
|
||
|
||
## 2026-10-22 故障与处理
|
||
|
||
当前环境为 Windows、Unity 2022.3.62f3、HybridCLR 8.14.1。
|
||
`HybridCLR/Generate/All` 在 `GenerateStripedAOTDlls` 内部调用 WebGL Player 构建。
|
||
本次错误发生在原生工具链,C# 编译已通过:
|
||
|
||
- `clang++` 编译 `mscorlib.cpp`、`UnityEngine.CoreModule__4.cpp` 时退出,前者返回 `3221226505`,后者包含 LLVM Instruction Selection 崩溃信息。
|
||
- 两个文件保持原来的 `-O3` 参数单独重编译均成功。
|
||
- Bee 并发降为 4 后,全部 C++ 编译通过;随后独立线程池中的 `wasm-opt` 返回 `3221225477`。
|
||
- 同一份 wasm 输入、同一优化参数在 `BINARYEN_CORES=4` 下单独处理成功。
|
||
|
||
上述证据支持限制构建并发作为规避措施,尚不能单独确定内存、硬件或工具链内部缺陷中的哪一项是根因。
|
||
|
||
## 项目处理
|
||
|
||
`AIClient/Assets/Editor/HybridCLR/WebGlBuildConcurrency.cs` 通过 Unity 构建回调处理 **Windows 编辑器中的 WebGL Player 构建**,包括标准 HybridCLR Gen All 内部的构建及微信导出:
|
||
|
||
- 未显式指定时,将当前进程的 `BEE_BUILD_THREADS`、`BINARYEN_CORES` 临时设为 `4`。
|
||
- 保留开发者或 CI 已提供的环境变量值。
|
||
- 成功后恢复环境变量;失败时通过编辑器空闲更新恢复,并在程序集重载前清理。
|
||
- 保留既有 C++/wasm 优化参数,不修改 Unity 安装目录或 PackageCache。
|
||
|
||
Bee 的并发环境变量也存在于当前 Unity 自带的 `bee_backend.exe` 中;本次采样确认 clang 进程数最多为 4。
|
||
Binaryen 对并发变量的说明见其[官方调试文档](https://github.com/WebAssembly/binaryen/wiki/Debugging)。
|
||
|
||
## 验证入口与记录
|
||
|
||
按项目 Unity Pipeline 流程编译后,执行:
|
||
|
||
```powershell
|
||
unity command --timeout 900 run_script --file AgentScripts/VerifyHybridClrGeneration.cs --entry VerifyHybridClrGeneration.GenerateAll --timeout_ms 900000 --project-path D:/UD/AI/AIGame/AIClient
|
||
```
|
||
|
||
该入口直接调用原始 `PrebuildCommand.GenerateAll()`,不自行设置线程环境变量,也不跳过步骤;检查 AOT DLL、生成文件及环境变量恢复。
|
||
成功回执写入 `Tools/output/hybridclr_genall/generate_all.json`。
|
||
|
||
本次标准流程于 2026-10-22 16:35(北京时间)通过,耗时约 295 秒:生成 55 个 AOT DLL,`MethodBridge.cpp`、`UnityVersion.h`、`link.xml`、`AOTGenericReferences.cs` 均为本轮更新,环境变量已恢复,生成后的 C# 编译通过。
|
||
`VerifyHybridClrGeneration.VerifyCallbacks` 另行验证了默认并发、成功清理、显式覆盖值保留和失败后空闲清理,全部通过。
|
||
|
||
辅助工具 `Tools/diagnose_webgl_clang.py` 和 `Tools/diagnose_webgl_wasm_opt.py` 从 Editor.log 提取失败命令,将重放输出写入 `Tools/output/hybridclr_genall/`,不修改 Unity 的构建产物。
|