mirror of
https://github.com/raphaelcheung/zircon-legend-server.git
synced 2026-10-18 14:35:14 +08:00
0ea9199c44
主循环与节流(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 缓存
114 lines
3.7 KiB
C#
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(); |