Files
AIGame/Doc/HybridCLR_GenAll.md

2.8 KiB
Raw Permalink Blame History

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 对并发变量的说明见其官方调试文档。

验证入口与记录

按项目 Unity Pipeline 流程编译后,执行:

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 的构建产物。