Files
Raphael 0ea9199c44 perf: 降低主循环 CPU 占用并减少热路径分配
主循环与节流(SEnvir.cs):
- 主循环加条件 Sleep:处理快于 1ms 预算时 Thread.Sleep(1) 让出 CPU,处理慢时不 Sleep 保吞吐(空闲 CPU 100%→<10%)
- ActiveObjects 为空时直接 break,避免空集合在 1ms 时间片内空转
- 跨日 GC.Collect 由 Forced 改 Optimized,消除每日 STW 尖刺
- 无玩家且无持久化变更时跳过自动保存与备份:加 DataChanged 脏标志,WebApi 命令/支付处理/跨日公会重置后置标志,保存条件改为 (Players.Count>0 || DataChanged),保存后清标志(AutoClearUserDatas 清理幂等不置标志)
- 异常 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 缓存
2026-09-09 20:15:47 +08:00

114 lines
3.7 KiB
C#

using System.Threading;
using System.Runtime;
using Library;
using Server.Envir;
using Server.WebApi;
using System.Reflection;
ConfigReader.Load();
string version = Assembly.GetExecutingAssembly().GetName().Version.ToString();
Console.WriteLine($"皓石传奇三 v{version}");
Console.WriteLine($"开源的传奇三,开源技术交流进QQ群① 915941142,群② 1076553894");
Console.WriteLine($"客户端更新路径:{Config.ClientPath}");
Console.WriteLine($"地图文件路径:{Config.MapPath}");
if (Config.ConnectionLimit <= 0 || Config.ConnectionLimit >= 65534)
{
Config.ConnectionLimit = 200;
Console.WriteLine($"[最大连接数量限制] 配置了无效值,恢复默认值 {Config.ConnectionLimit}...");
}
Console.WriteLine($"最大连接数量限制:{Config.ConnectionLimit}");
if (Config.武器重置等待分钟 < 0)
{
Config.武器重置等待分钟 = 24 * 60;
Console.WriteLine($"[武器重置等待分钟] 配置了无效值,恢复默认值 {Config.武器重置等待分钟} ...");
}
if (Config.挖出的黑铁矿最小纯度 < 0 )
{
Config.挖出的黑铁矿最小纯度 = 25;
Console.WriteLine($"[挖出的黑铁矿最小纯度] 设置了无效值,恢复默认值 {Config.挖出的黑铁矿最小纯度} ...");
}
if (Config.挖出的黑铁矿最大纯度 < Config.挖出的黑铁矿最小纯度)
{
Config.挖出的黑铁矿最大纯度 = Config.挖出的黑铁矿最小纯度;
Console.WriteLine($"[挖出的黑铁矿最大纯度] 设置了无效值,恢复默认值 {Config.挖出的黑铁矿最大纯度}...");
}
if (Config.技能最高等级 < 0)
{
Config.技能最高等级 = 3;
Console.WriteLine($"[技能最高等级] 设置了无效值,恢复默认值 {Config.技能最高等级} ...");
}
if (Config.数据清理间隔分钟 < 0)
{
Config.数据清理间隔分钟 = 0;
Console.WriteLine($"[内存垃圾回收间隔多少分钟] 设置了无效值,恢复默认值 {Config.数据清理间隔分钟} ...");
}
if (Config.武器重置时每多少点属性保留一点 <= 0)
{
Config.武器重置时每多少点属性保留一点 = 10;
Console.WriteLine($"[武器重置时每多少点属性保留一点] 设置了无效值,恢复默认值 {Config.武器重置时每多少点属性保留一点} ...");
}
if (Config.武器重置冷却分钟 < 0)
{
Config.武器重置冷却分钟 = 1440;
Console.WriteLine($"[武器重置冷却分钟] 设置了无效值,恢复默认值 {Config.武器重置冷却分钟} ...");
}
if (Config.判断敏感词最大跳几个字符 < 0)
{
Config.判断敏感词最大跳几个字符 = 2;
Console.WriteLine($"[判断敏感词最大跳几个字符] 设置了无效值,恢复默认值 {Config.判断敏感词最大跳几个字符} ...");
}
if (Config.宠物不追击距离玩家多少格以外的敌人 <= 0)
{
Config.宠物不追击距离玩家多少格以外的敌人 = 10;
Console.WriteLine($"[宠物不追击距离玩家多少格以外的敌人] 设置了无效值,恢复默认值 {Config.宠物不追击距离玩家多少格以外的敌人} ...");
}
GCSettings.LatencyMode = GCLatencyMode.SustainedLowLatency;
bool stop = false;
bool running = true;
Task.Run(() =>
{
stop = false;
while (running)
{
while (SEnvir.DisplayLogs.TryDequeue(out string? log))
{
if (log != null) Console.WriteLine(log);
}
Thread.Sleep(100);
}
stop = true;
});
SEnvir.LoadBlock();
SEnvir.LoadClientHash();
var log = SEnvir.LoadRebirthInfo();
if (!string.IsNullOrEmpty(log)) SEnvir.Log(log);
// Start WebAPI server (must be before StartServer because EnvirLoop blocks)
WebApiStartup.Start();
SEnvir.StartServer();
while(!stop) Thread.Sleep(100);
//ConfigReader.Save();