using System.Collections.Generic; using Sog; using Sog.Log; namespace Battle { /// /// game服务器统计相关信息的辅助类 /// public static class BattleServerStat { private static long m_lastLogTime; public static void Tick(long nowMs) { ServerStat.Instance.Tick(nowMs); //每分钟记录一次一些信息 if (nowMs < m_lastLogTime + 60000) { return; } m_lastLogTime = nowMs; WriteServerStat(); } private static void WriteServerStat() { LogBattleCheckStat(); } private static void LogBattleCheckStat() { var checkStat = BattleServerUtils.GetBattleServerData().battleCheckStat; // 1秒的逻辑需要多少毫秒进行校验 float checkRate = 0.0f; if (checkStat.battleLogicTimeMs > 0) { checkRate = checkStat.battleCheckTimeMs * 1000.0f / checkStat.battleLogicTimeMs; } TraceLog.Stat("CheckStat_1Min: battleNum {0} succ {1} max checkTimeMs {2} max mainland {3} logicTime {4:N3} checkTimeMs {5} checkRate {6:N3} arena {7} succ {8}" , checkStat.battleNum, checkStat.checkSuccBattleNum , checkStat.maxCheckTimeMs, checkStat.maxMainlandId , checkStat.battleLogicTimeMs / 1000.0f, checkStat.battleCheckTimeMs , checkRate, checkStat.arenaNum, checkStat.checkSuccArenaNum); checkRate = 0.0f; if (checkStat.battleLogicTimeMs_total > 0) { checkRate = checkStat.battleCheckTimeMs_total * 1000.0f / checkStat.battleLogicTimeMs_total; } TraceLog.Stat("CheckStat_Total: battleNum {0} succ {1} max checkTimeMs {2} max mainland {3} logicTime {4:N3} checkTimeMs {5} checkRate {6:N3} arena {7} succ {8}" , checkStat.battleNum_total, checkStat.checkSuccBattleNum_total , checkStat.maxCheckTimeMs_total, checkStat.maxMainlandId_total , checkStat.battleLogicTimeMs_total / 1000.0f, checkStat.battleCheckTimeMs_total , checkRate, checkStat.arenaNum_total, checkStat.checkSuccArenaNum_total); foreach (var kvp in checkStat.errorCount) { TraceLog.Stat("CheckStat: error code {0} count {1}", kvp.Key, kvp.Value); } foreach (var kvp in checkStat.appVersionFailCount) { TraceLog.Stat("CheckStat: appVersion {0} fail {1}", AppVersion.ToStringVersion(kvp.Key), kvp.Value); } long totalNum = checkStat.totalMainlandNum; TraceLog.Stat("MainlandType EnterNum Permillage"); if(totalNum > 0) { foreach (var kvp in checkStat.enterMainlandNum) { TraceLog.Stat("{0,-15}{1,-10} {2,-6}", kvp.Key, kvp.Value, kvp.Value * 1000 / totalNum); } } TraceLog.Stat("MainlandTotalNum:{0}", totalNum); TraceLog.Stat("ArenaType EnterNum Permillage"); totalNum = checkStat.totalArenaNum; if(totalNum > 0) { foreach (var kvp in checkStat.enterArenaNum) { TraceLog.Stat("{0,-10}{1,-10} {2,-6}", kvp.Key, kvp.Value, kvp.Value * 1000 / totalNum); } } TraceLog.Stat("ArenaTotalNum:{0}", totalNum); checkStat.battleNum = 0; checkStat.checkSuccBattleNum = 0; checkStat.maxCheckTimeMs = 0; checkStat.maxMainlandId = 0; checkStat.battleLogicTimeMs = 0; checkStat.battleCheckTimeMs = 0; checkStat.arenaNum = 0; checkStat.checkSuccArenaNum = 0; } public static void AddIDValue(string id, long value, bool clear) { ServerStat.Instance.AddValue(id, value, clear); } public static void SetIDValue(string id, long value, bool clear) { ServerStat.Instance.SetValue(id, value, clear); } } }