diff options
| author | Somhairle H. Marisol <[email protected]> | 2026-09-19 00:18:43 +0800 |
|---|---|---|
| committer | Somhairle H. Marisol <[email protected]> | 2026-09-19 00:18:43 +0800 |
| commit | 59458d149d7cecf73e708faa6d9e6db2bcd89dfd (patch) | |
| tree | af342c6a01766be326857f48ebe5c65529e50882 /LivingVillage.sln | |
| parent | b237a11908442a227361fae24dbdd0dbb287fac9 (diff) | |
| download | living-village-59458d149d7cecf73e708faa6d9e6db2bcd89dfd.tar.gz | |
feat: M1 模拟器内核 — SplitMix64 RNG + 确定性 step + 对拍测试 + headless 冒烟工具 + Desktop 自动演示
[变更性质]
本 commit 为功能开发,交付设计文档 §2 模拟器内核(里程碑 M1),非缺陷修复或结构重构。
[新增功能]
- Kernel:Rng.fs 提供 SplitMix64 纯函数 RNG(ofSeed / nextUInt64 / nextFloat32),World 携带种子状态。
- Kernel:Sim.fs 重写为 struct record(Vec2/Avatar/Input/TimeStep/World),step : World → TimeStep → World 纯函数,dt 固定 1/60 由内核常量给定,Time = Tick * dt 不做浮点累加;initialWorld 由无参改为带 seed。
- Tests:MSTest 确定性对拍——同 seed 轨迹逐 tick 相等、异 seed 发散、step 纯度、长跑有限/有界/时间-刻度关系、SplitMix64 已知向量、nextFloat32 值域。
- Headless:--days N --seed S 冒烟工具,每 1000 tick 输出摘要行,统计 NaN/越界计数并决定退出码。
- Desktop:LV_AUTOPLAY=1 环境变量启用正弦驱动自动演示,窗口标题与启动日志标注模式。
[实现方案]
- 全部状态用 [<Struct>] record,模拟路径零堆分配,支撑 51.84 亿刻长跑。
- step 不消费 World 内 RNG,种子经由外部确定性驱动脚本生效(每 900 刻换段,8 方向查表 + 三档幅值,避开三角函数保证跨平台位精确)。
- Headless 内存口径取 GC.GetTotalMemory(true)(全收集后的稳态驻留),避免 GetTotalMemory(false) 随 Gen0 段扩张漂移误报泄漏。
[影响范围]
- Kernel 保持零 MonoGame 引用,模拟与渲染彻底分离;sln 新增 Headless 与 Tests 两个项目。
- Release 构建 0 警告 0 错误,7/7 测试通过;1000 天长跑 5,184,000,000 刻退出码 0,无 NaN 无越界,内存 87,824 → 93,000 字节(1.06x < 2x)。
- 同 seed 两次运行 stdout 字节一致,seed 42/43 轨迹不同。
Diffstat (limited to 'LivingVillage.sln')
| -rw-r--r-- | LivingVillage.sln | 14 |
1 files changed, 14 insertions, 0 deletions
diff --git a/LivingVillage.sln b/LivingVillage.sln index 4e8f210..5792693 100644 --- a/LivingVillage.sln +++ b/LivingVillage.sln @@ -9,6 +9,10 @@ Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "LivingVillage.Kernel", "src EndProject
Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "LivingVillage.Desktop", "src\LivingVillage.Desktop\LivingVillage.Desktop.fsproj", "{CC15DA38-E36A-45A2-A031-5392C8A6BF0D}"
EndProject
+Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "LivingVillage.Headless", "src\LivingVillage.Headless\LivingVillage.Headless.fsproj", "{0CC4C137-0002-4A62-A743-BBCF022DF8E3}"
+EndProject
+Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "LivingVillage.Kernel.Tests", "src\LivingVillage.Kernel.Tests\LivingVillage.Kernel.Tests.fsproj", "{524DF44B-ECF6-4537-8F42-2C6CA357372F}"
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@@ -26,9 +30,19 @@ Global {CC15DA38-E36A-45A2-A031-5392C8A6BF0D}.Debug|Any CPU.Build.0 = Debug|Any CPU
{CC15DA38-E36A-45A2-A031-5392C8A6BF0D}.Release|Any CPU.ActiveCfg = Release|Any CPU
{CC15DA38-E36A-45A2-A031-5392C8A6BF0D}.Release|Any CPU.Build.0 = Release|Any CPU
+ {0CC4C137-0002-4A62-A743-BBCF022DF8E3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {0CC4C137-0002-4A62-A743-BBCF022DF8E3}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {0CC4C137-0002-4A62-A743-BBCF022DF8E3}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {0CC4C137-0002-4A62-A743-BBCF022DF8E3}.Release|Any CPU.Build.0 = Release|Any CPU
+ {524DF44B-ECF6-4537-8F42-2C6CA357372F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {524DF44B-ECF6-4537-8F42-2C6CA357372F}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {524DF44B-ECF6-4537-8F42-2C6CA357372F}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {524DF44B-ECF6-4537-8F42-2C6CA357372F}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(NestedProjects) = preSolution
{504BBDD4-106D-4423-A3BE-9A82848D1656} = {DFF4B1C6-CF0A-45CB-912B-5BFD446A76FF}
{CC15DA38-E36A-45A2-A031-5392C8A6BF0D} = {DFF4B1C6-CF0A-45CB-912B-5BFD446A76FF}
+ {0CC4C137-0002-4A62-A743-BBCF022DF8E3} = {DFF4B1C6-CF0A-45CB-912B-5BFD446A76FF}
+ {524DF44B-ECF6-4537-8F42-2C6CA357372F} = {DFF4B1C6-CF0A-45CB-912B-5BFD446A76FF}
EndGlobalSection
EndGlobal
|
