// BulletManagerCs — 子弹 SoA 热路径 C# 内核(S0 骨架) // S0 范围:帧时间监控 + AsSpan() 沟通基线验证 // 完整积分热路径在 S1 展开(见 development_plan.md S1) // ADR-L1 规厙1:内层循环禁止 Call() | 规厙2:热数据通过 AsSpan() 零拷贝 using Godot; using System; public partial class BulletManagerCs : Node { private GodotObject _gdBulletManager; // S0 性能计时(P-S0-07 帧预算回填) private double _accumMs; private int _frames; public override void _Ready() { _gdBulletManager = Engine.GetSingleton("BulletManager"); // S0 骨架不接管积分,保持 _cs_node = null,让 GDScript fallback 运行 GD.Print("[BulletManagerCs] S0 骨架就绪,GDScript fallback 活跞"); } public override void _PhysicsProcess(double delta) { if (_gdBulletManager is null) return; var t0 = Time.GetTicksUsec(); // S0:仅记录帧时间(积分由 GDScript fallback 负责) var activeCount = _gdBulletManager.Get("_active_count").AsInt32(); _ = activeCount; _accumMs += (Time.GetTicksUsec() - t0) / 1000.0; _frames++; if (_frames >= 60) { GD.Print($"[BulletManagerCs] 帧时间均倦: {_accumMs / _frames:F3} ms " + $"(active={activeCount} TODO S1: 启用完整热路径)"); _accumMs = 0; _frames = 0; } } }