Files
Raphael 239c874800 perf: 全面降低 CPU 占用与热路径分配,控制破坏性
主循环节流(SEnvir.cs):
- 主循环加条件 Sleep:处理快于 1ms 预算时 Thread.Sleep(1) 让出 CPU,处理慢时不 Sleep 保吞吐(空闲 CPU 100%→<10%)
- ActiveObjects 为空时直接 break,避免空集合在 1ms 时间片内空转
- 跨日 GC.Collect 由 Forced 改 Optimized,消除每日 STW 尖刺

保存与备份(SEnvir.cs):
- 无玩家且无持久化变更时跳过自动保存与备份:加 DataChanged 脏标志,WebApi 命令/支付处理/跨日公会重置后置标志,保存条件改为 (Players.Count>0 || DataChanged),保存后清标志
- DB Save 移后台线程:Session.Save(false) 从主线程移到后台 Thread,消除每 5 分钟主循环停顿;lambda catch 捕获异常并重置 Saving 标志,保证不死锁
- 异常 catch 的 File.AppendAllText 改为入队 ErrorLogs,由 WriteLogsLoop 异步落盘,避免主循环被磁盘 I/O 阻塞

热路径去 LINQ 与分配(PlayerObject/MonsterObject/MapObject.cs):
- PlayerObject.Process 的每 tick HashSet 改为复用字段 _tagClearList
- MonsterObject.ViewRange 的 PoisonList.Any 改为每 tick Process 中刷新的 _hasAbyssPoison 缓存
- MapObject.CanBeSeenBy 的 Buffs.Any(Cloak||Transparency) 改为 ProcessBuff 每 tick 刷新的 _hasCloakOrTransparency 缓存
- AddAllObjects 数据可见性遍历分区:仅 Player 与 Boss Monster 需全服遍历(组/公会/配偶/追踪跨地图),其他对象(普通怪/物品/魔法效果)只遍历同地图玩家,消除多数 AddAllObjects 调用的全服遍历

网络包分发与发送(Library/BaseConnection.cs,子模块):
- 反射 MethodInfo.Invoke + new object[]{p} 改为表达式树编译的强类型委托 Action<BaseConnection,Packet>,消除反射调用与每包数组分配
- 发送缓冲 List<byte>+AddRange+ToArray 三次拷贝改为 MemoryStream(8192)+Write+GetBuffer 零拷贝,BeginSend 签名改为 byte[]+length

存盘并发安全(Library/DBCollection.cs,子模块):
- SaveObjects 的 foreach(Binding) 改为索引遍历 + count 快照 + 越界保护,配合 DB Save 后台化避免主循环增删 Binding 时抛 InvalidOperationException
2026-09-10 13:58:46 +08:00
..