2021-04-08 20:09:59 +08:00
|
|
|
|
using Cal;
|
|
|
|
|
using System;
|
|
|
|
|
using System.Net;
|
|
|
|
|
|
|
|
|
|
namespace ET
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
public class HeartBeatAwakeSystem : AwakeSystem<HeartBeatComponent>
|
|
|
|
|
{
|
|
|
|
|
public override void Awake(HeartBeatComponent self)
|
|
|
|
|
{
|
|
|
|
|
self.Awake();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public class HeartBeatUpdateSystem : UpdateSystem<HeartBeatComponent>
|
|
|
|
|
{
|
|
|
|
|
public override void Update(HeartBeatComponent self)
|
|
|
|
|
{
|
|
|
|
|
self.Update();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public class HeartBeatDestroySystem : DestroySystem<HeartBeatComponent>
|
|
|
|
|
{
|
|
|
|
|
public override void Destroy(HeartBeatComponent self)
|
|
|
|
|
{
|
|
|
|
|
self.Destroy();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Session心跳组件(需要挂载到Session上)
|
|
|
|
|
/// </summary>
|
|
|
|
|
public class HeartBeatComponent : Entity
|
|
|
|
|
{
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 更新间隔
|
|
|
|
|
/// </summary>
|
|
|
|
|
private const int UpdateInterval = 1*1000;
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 超出时间
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <remarks>如果跟客户端连接时间间隔大于在服务器上删除该Session</remarks>
|
|
|
|
|
private const int OutInterval = 5000;
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 记录时间
|
|
|
|
|
/// </summary>
|
|
|
|
|
private long _recordDeltaTime = 0;
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 当前Session连接时间
|
|
|
|
|
/// </summary>
|
|
|
|
|
public long CurrentTime = 0;
|
|
|
|
|
|
|
|
|
|
private Session session;
|
|
|
|
|
|
|
|
|
|
private int frame;
|
|
|
|
|
public float DelayTime{get; private set;}
|
|
|
|
|
internal void Awake()
|
|
|
|
|
{
|
|
|
|
|
session = this.GetParent<Session>();
|
|
|
|
|
}
|
|
|
|
|
public void Update()
|
|
|
|
|
{
|
|
|
|
|
frame++;
|
2021-04-11 19:50:39 +08:00
|
|
|
|
long now = TimeHelper.ClientNow();
|
2021-04-08 20:09:59 +08:00
|
|
|
|
// 如果没有到达发包时间、直接返回
|
|
|
|
|
if ((now - this._recordDeltaTime) < UpdateInterval || this.CurrentTime == 0) return;
|
|
|
|
|
// 记录当前时间
|
|
|
|
|
this._recordDeltaTime = now;
|
|
|
|
|
|
|
|
|
|
DelayTime = UpdateInterval / (float)frame;
|
|
|
|
|
frame = 0;
|
|
|
|
|
//Log.Warning($"FPS:{1000/delayTime:f2} time:{delayTime:f2}");
|
|
|
|
|
|
|
|
|
|
if (now - CurrentTime > OutInterval)
|
|
|
|
|
{
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
User user = session.GetComponent<SessionPlayerComponent>().User;
|
|
|
|
|
if (user == null)
|
|
|
|
|
{
|
|
|
|
|
Log.Error($"user == null");
|
|
|
|
|
this.Dispose();
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
catch (Exception e)
|
|
|
|
|
{
|
|
|
|
|
Log.Error(e);
|
|
|
|
|
}
|
|
|
|
|
this.Dispose();
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
//Log.Debug($"心跳成功:{session.GetComponent<SessionPlayerComponent>().User.NickName}");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
internal void Destroy()
|
|
|
|
|
{
|
|
|
|
|
_recordDeltaTime = 0;
|
|
|
|
|
CurrentTime = 0;
|
|
|
|
|
frame = 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
}
|