You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

90 lines
2.6 KiB

using Sog;
using System.Collections.Generic;
using System.Linq;
using ProtoCSStruct;
namespace World
{
//先放在World,之后看看需求是否移动到Friend
public class RoleCacheInfoSvc : IServerDataObj
{
//Key:playerUid , value:m_RoleCacheStructList pos index
public Dictionary<long, long> m_selfIDMap;
private static StructMemoryCache<OneRoleCacheStruct> m_RoleCacheStructList;
public RoleCacheInfoSvc()
{
m_selfIDMap = new Dictionary<long, long>();
m_RoleCacheStructList = new StructMemoryCache<OneRoleCacheStruct>((int)RoleCacheDef.MaxRoleCacheCount);
}
public bool RemoveOneRoleCacheByUid(long playerUid)
{
if (m_selfIDMap.TryGetValue(playerUid, out long pos))
{
m_selfIDMap.Remove(playerUid);
m_RoleCacheStructList.Free(pos);
return true;
}
return false;
}
/// <summary>
/// 增加一个空的,具体数据设置自己接返回值然后处理
/// </summary>
/// <param name="playerUid"></param>
/// <returns></returns>
public ref OneRoleCacheStruct AddOneRoleCacheByUid(long playerUid)
{
if (m_selfIDMap.ContainsKey(playerUid))
{
return ref GetOneRoleCacheStructByUid(playerUid);
}
//满了的话,默认移除掉m_selfIDMap的第一个
if (m_RoleCacheStructList.m_freeQueue.Count == 0)
{
RemoveOneRoleCacheByUid(m_selfIDMap.FirstOrDefault().Key);
}
//移除失败的话,再尝试移除最后一个
if (m_RoleCacheStructList.m_freeQueue.Count == 0)
{
RemoveOneRoleCacheByUid(m_selfIDMap.LastOrDefault().Key);
}
//还是不行直接返回吧
if (m_RoleCacheStructList.m_freeQueue.Count == 0)
{
return ref m_RoleCacheStructList.GetByIndex(0); ;
}
m_selfIDMap.Add(playerUid, m_RoleCacheStructList.m_freeQueue.Peek());
ref var one = ref m_RoleCacheStructList.Malloc();
one.LastAccessTime = 0;
one.showInfo.Clear();
one.sysData.Clear();
return ref one;
}
public ref OneRoleCacheStruct GetOneRoleCacheStructByUid(long playerUid)
{
if (m_selfIDMap.TryGetValue(playerUid, out long pos))
{
return ref m_RoleCacheStructList.GetByIndex(pos);
}
return ref m_RoleCacheStructList.GetByIndex(0);
}
public bool RoleCacheIsFull()
{
//还剩11个空间的时候就认为满了,可以删除一些
if (m_selfIDMap.Count + 11 >= (int) RoleCacheDef.MaxRoleCacheCount)
{
return true;
}
return false;
}
public override int GetDataType()
{
return WorldDataObjType.RoleCacheInfo;
}
}
}