Files
AIGame/Doc/HybridCLR_GenAll.md

43 lines
2.8 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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 的构建产物。