using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Sog; namespace Friend { public class FriendInfoCache : IServerDataObj { // uid -> m_cacheStructFriendInfo[] 中的索引 public static Dictionary m_selfIDMap; // 玩家自己好友相关的数据 public static StructMemoryCache m_cacheStructFriendInfo; // 玩家好友列表中每个好友的数据 public static StructMemoryCache m_cacheStructFriendOne; // 玩家操作列表的数据, 比如申请好友, 删除好友 public static StructMemoryCache m_cacheStructFriendOneOp; // 玩家私聊 public static StructMemoryCache m_cacheStructFriendChat; // 陌生人推荐 public static StructMemoryCache m_cacheStructFriendStranger; // 不在当前服务器上的好友索引, uid -> m_remoteFriendOneCache [] 中的索引 public static Dictionary m_remoteFriendIDMap; // 不在当前服务器上的好友的数据 public static StructMemoryCache m_remoteFriendOneCache; // 好友数据中的icon压缩以后长度不会大于35,这里加个数字检查下是否有bug,停服的时候打个log public long ErrIconCount; public FriendInfoCache(int self, int friendList, int friendOp, int chatList, int stranger) { m_selfIDMap = new Dictionary(); //(备注下:目前一旦超过FriendStructDef.MaxFriendSelfCount限制,peek就会崩溃,代码注意判断) m_cacheStructFriendInfo = new StructMemoryCache(self); //DBFriendOneStruct 312 byte // friendOpData和strangerList里面也占用了DBFriendOneStruct int friendOneNum = self * (friendList + friendOp + chatList + stranger) / 4; m_cacheStructFriendOne = new StructMemoryCache(friendOneNum); m_cacheStructFriendOneOp = new StructMemoryCache(self * friendOp / 4); // DBFriendChatOneStruct 712 m_cacheStructFriendChat = new StructMemoryCache(self * chatList / 4); if (stranger > 1) { m_cacheStructFriendStranger = new StructMemoryCache(self * stranger / 4); } else { // 陌生人功能现在不要了, 以防策划临时起意又改回来, 分配1个单位内存 m_cacheStructFriendStranger = new StructMemoryCache(1); } m_remoteFriendIDMap = new Dictionary(); // 目前只有好友列表中的不属于当前服务器的好友信息会放在remote中 // 最大值 = self_num * max_friend_person, 假设所有人的好友都不在同一个服务器 // RemoteFriendOneStruct 312 m_remoteFriendOneCache = new StructMemoryCache(self * friendList / 4); } public override int GetDataType() { return FriendDataObjType.FriendInfoCache; } } }