/* Sog 游戏基础库 2016 by zouwei */ using System; using System.Collections.Generic; namespace Sog { /* * server id * 16 8 8 * worldid,servertypeid,instanceid */ public static class ServerIDUtils { //基于服务器id是有限的这个前提,IDToString可以做性能优化,整个服务器组一般来说进程数量不会超过1000个吧 //加cache性能提高明显,日志中大量使用IDToString,优化还是有必要的 private const int MAX_CHACHE_ID_COUNT = 1000; private static Dictionary m_serverIDCache = new Dictionary(MAX_CHACHE_ID_COUNT); public static uint IDToNumber(string strID) { string[] arrayID = strID.Split('.'); if(arrayID.Length != 3) { return 0; } uint sip1 = UInt32.Parse(arrayID[0]); uint sip2 = UInt32.Parse(arrayID[1]); uint sip3 = UInt32.Parse(arrayID[2]); uint tmpNumber; tmpNumber = sip1 * 256 * 256 + sip2 * 256 + sip3; return tmpNumber; } // public static string IDToString(uint id) { string strID; //说明,用TryGetValue比判断ContainsKey后再取值效率高,原因是TryGetValue只需要查找一次,ContainsKey后再取值查找了2次 if(m_serverIDCache.TryGetValue(id, out strID)) { return strID; } uint s1 = id >> 16; uint s2 = (id & 0x0000ffff) >> 8; uint s3 = id & 0x000000ff; //经过测试,string直接+(前提是固定数量的string,编译器会优化)的效率比StringBuilder还高... //string.format底层使用的是StringBuilder,效率和StringBuilder是一样的 /* m_stringBuilder.Clear(); m_stringBuilder.AppendFormat("{0}.{1}.{2}", s1, s2, s3); m_stringBuilder.Append(s1); m_stringBuilder.Append(m_strDot); m_stringBuilder.Append(s2); m_stringBuilder.Append(m_strDot); m_stringBuilder.Append(s3); string strID = m_stringBuilder.ToString(); */ //string strID = string.Format("{0}.{1}.{2}", s1, s2, s3); strID = s1.ToString() + "." + s2.ToString() + "." + s3.ToString(); //最多cache 多少个 if (m_serverIDCache.Count < MAX_CHACHE_ID_COUNT) { m_serverIDCache.Add(id, strID); } return strID; } //根据一个服务器类型,实例ID获取第0层服务器ID,比如VersionServer,这种 //0层服务器worldid为0 public static uint GetLevel0ServerIDByType(int serverType, int instID) { uint level1serverID = (uint)( (serverType << 8) | instID); return level1serverID; } //根据一个服务器类型,实例ID获取第1层服务器ID,比如AccountServer,这种 public static uint GetLevel1ServerIDByType(uint srcServerId,int serverType, int instID) { uint level1serverID = (srcServerId & 0xffff0000) | ((uint)serverType << 8) | (uint)instID; return level1serverID; } //根据一个服务器类型,实例ID获取第1层服务器ID,比如AccountServer,这种 public static uint MakeServerID(int worldId, int serverType, int instID) { uint tmpNumber; tmpNumber = (uint)worldId * 256 * 256 + (uint)serverType * 256 + (uint)instID; return tmpNumber; } public static int GetServerType(uint id) { int iServerType = (int)((id & 0x0000ff00) >> 8); return iServerType; } // worldid public static uint GetWorldID(uint srcServerId) { return (srcServerId & 0xffff0000) >> 16; } //instid public static uint GetInstanceID(uint srcServerId) { return srcServerId & 0x000000ff; } public static bool IsClusterServer(uint serverId) { return (serverId & 0xffff0000) == 0; } } }