1,foreach 循环用迭代器替代
使用迭代器进行循环
//释放对象池
public void Clear()
{
lock (mClassObjectPoolDic)
{
var enumerator = mClassObjectPoolDic.GetEnumerator();
while (enumerator.MoveNext())
{
int key = enumerator.Current.Key;
}
}
}
foreach 优化
public void Dispose()
{
//foreach(var fsm in m_FsmDic)
//{
// fsm.Value.ShutDown();
//}
var enumerator = m_FsmDic.GetEnumerator();
while (enumerator.MoveNext())
{
enumerator.Current.Value.ShutDown();
}
m_FsmDic.Clear();
}
2,网络优化
优化的
3.优化Socket发包进行小包合并发送
#region CheckSendQueue 检查发送队列
/// <summary>
/// 检查发送队列,小包合并成打包发送
/// </summary>
private void CheckSendQueue()
{
if (m_SendCount >= GameEntry.Socket.MaxSendCount)
{
//等待下一帧发送
m_SendCount = 0;
return;
}
lock (m_SendQueue)
{
if (m_SendQueue.Count > 0 || m_IsHasUnDealBytes)
{
MMO_MemoryStream ms = m_SocketSendMS;
ms.SetLength(0);
//上次超过长度未处理的包
if (m_IsHasUnDealBytes)
{
m_IsHasUnDealBytes = false;
ms.Write(m_UnDealBytes, 0, m_UnDealBytes.Length);
}
while (true)
{
if (m_SendQueue.Count == 0) break;
//从队列中取出一个字节数组
byte[] buffer = m_SendQueue.Dequeue();
if (buffer.Length + ms.Length <= GameEntry.Socket.MaxSendByteCount)
{
ms.Write(buffer, 0, buffer.Length);
}
else
{
//已经从队列中取出找个字节了,先缓存起来,记下未处理
m_UnDealBytes = buffer;
m_IsHasUnDealBytes = true;
break;
}
}
m_SendCount++;
Send(ms.ToArray());
}
}
}
#endregion
#region MakeData 封装数据包
/// <summary>
/// 封装数据包
/// </summary>
/// <param name="data"></param>
/// <returns></returns>
private byte[] MakeData(byte[] data)
{
byte[] retBuffer = null;
//1.如果数据包的长度 大于了m_CompressLen 则进行压缩
bool isCompress = data.Length > m_CompressLen ? true : false;
if (isCompress)
{
data = ZlibHelper.CompressBytes(data);
}
//2.异或
data = SecurityUtil.Xor(data);
//3.Crc校验 压缩后的
ushort crc = Crc16.CalculateCrc16(data);
MMO_MemoryStream ms = m_SocketSendMS;
ms.SetLength(0);
ms.WriteUShort((ushort)(data.Length + 3));
ms.WriteBool(isCompress);
ms.WriteUShort(crc);
ms.Write(data, 0, data.Length);
retBuffer = ms.ToArray();
return retBuffer;
}