内存优化

This commit is contained in:
lishuo 2024-01-24 15:23:28 +08:00
parent 8f0845faaa
commit b07be239fd
6 changed files with 368 additions and 202 deletions

View File

@ -1,14 +1,10 @@
using OnlineUserPool.Api;
using OnlineUserPool.Model;
using OnlineUserPool.Unility;
using Serilog;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Timers;
namespace OnlineUserPool.Hander
{
@ -16,13 +12,19 @@ namespace OnlineUserPool.Hander
{
private static List<MapRecordRanking> mapRecordRankings = new List<MapRecordRanking>();
private static object locker = new object();//防止服务端响应慢,多次加载
//private int top = ConfigHelp.Top;
private const int START = 120;
private const int SMALL = 100;
private const int MEDIUM = 150;
private const int LARGE = 180;
private const int OFFSET = 15;
const int offset = 1;
const int timeInterval = 15;
List<MsgModel> msgModels = new List<MsgModel>();
private DateTime UpdateVirtualTime { get; set; }
public MapRecordRankingHander()
{
Init();
//var timer = new Timer();
//timer
}
private void Init()
@ -32,26 +34,13 @@ namespace OnlineUserPool.Hander
var records = WebService.GetMapRouteRandomRecord(START, null);
mapRecordRankings.AddRange(WebService.GetRecordFileFromServer(records.Select(n => n.Id).ToList()));
UpdateVirtualTime = DateTime.Now;
//var pageSize = 10;
//var pageCount = (int)Math.Ceiling(records.Count / (double)pageSize);
//for (int i = 0; i < pageCount; i++)
//{
// mapRecordRankings.AddRange(WebService.GetRecordFileFromServer(records.Skip(i * pageSize).Take(pageSize).Select(n => n.Id).ToList()));
//}
}
}
private const int START = 120;
private const int SMALL = 100;
private const int MEDIUM = 150;
private const int LARGE = 180;
private const int OFFSET = 15;
//根据当前时段计算虚拟总人数
private int ComputeTop()
{
var rand = new Random();
var hour = DateTime.Now.Hour;//当前点数
int offset = 1;//少1 中3 多10
if (hour <= 6)
@ -79,11 +68,13 @@ namespace OnlineUserPool.Hander
/// <returns></returns>
public List<MsgModel> GetVirtualUserData()
{
List<MsgModel> msgModels = new List<MsgModel>();
if(ConfigHelp.ShowVirtualUser == false)
msgModels.Clear();
if (ConfigHelp.ShowVirtualUser == false)
{
return msgModels;
}
if (mapRecordRankings != null)
{
for (int i = 0; i < mapRecordRankings.Count; i++)
@ -93,12 +84,7 @@ namespace OnlineUserPool.Hander
var item = mapRecordRankings[i];
item.CurrentIndex++;
TargetData targetData = item.GetCurrentTargetData();
//List<string> prop = new List<string>()
//{
// Math.Round(targetData._Speed, 2).ToString(),
// targetData._Power.ToString(),
// targetData._Cadence.ToString()
//};
var weightKg = 0.0D;
if (targetData._Power >= 0)
{
@ -110,9 +96,9 @@ namespace OnlineUserPool.Hander
//机器人上线
var loginInfo = new MsgModel()
{
exit = item.End,
Exit = item.End,
IsCompleted = item.End,
MemberId = item.UserId,//虚拟的人Id变为负数
MemberId = item.UserId, //虚拟的人Id变为负数
Point = new double[] { -1d, -1d },
//Prop = string.Join(',', prop),
RouteId = item.RouteId,
@ -126,11 +112,12 @@ namespace OnlineUserPool.Hander
};
msgModels.Add(loginInfo);
}
var info = new MsgModel()
{
exit = item.End,
Exit = item.End,
IsCompleted = item.End,
MemberId = item.UserId,//虚拟的人Id变为负数
MemberId = item.UserId, //虚拟的人Id变为负数
Point = new double[] { Math.Round(targetData._Lat, 6), Math.Round(targetData._Lon, 6) },
//Prop = string.Join(',', prop),
RouteId = item.RouteId,
@ -150,11 +137,10 @@ namespace OnlineUserPool.Hander
}
}
}
return msgModels;
}
const int offset = 1;
const int timeInterval = 15;
private DateTime UpdateVirtualTime { get; set; }
/// <summary>
/// 删除已经骑行完的人,添加新的人物进去
/// </summary>
@ -162,11 +148,9 @@ namespace OnlineUserPool.Hander
{
lock (locker)
{
//var offlineCount = mapRecordRankings.Where(c => c.End).Count();//下线人数
var top = ComputeTop();//理论上当前时间段虚拟用户的总数
mapRecordRankings.RemoveAll(n => n.End);//移除骑行结束的人
var routeIds = mapRecordRankings.Select(n => n.RouteId).Distinct().ToList();
var currentVirtualCount = mapRecordRankings.Count(d => d.UserId < 0);//实际虚拟用户数
if (top - currentVirtualCount > 0)
{

View File

@ -68,7 +68,7 @@ namespace OnlineUserPool.Hander
var point = _turfHelper.Along(item.Distance * _index);
var info = new MsgModel()
{
exit = false,
Exit = false,
IsCompleted = false,
MemberId = item.Id,//虚拟的人Id变为负数
Point = new double[] { Math.Round(point.Latitude, 6), Math.Round(point.Longitude, 6) },
@ -81,7 +81,7 @@ namespace OnlineUserPool.Hander
Speed = item.Speed,
WeightKg = 0,
PreDistance = preDistance,
Competitionid = _competitionid
CompetitionId = _competitionid
};
msgModels.Add(info);
}

View File

@ -1,31 +1,85 @@
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Text;
using System;
namespace OnlineUserPool.Model
{
public class MsgModel : ReceiveModel
{
public int RouteId { get; set; }
public int MemberId { get; set; }
public double[] Point { get; set; }
public bool IsCompleted { get; set; }
private int _RouteId = 0;
public int RouteId {
get {
return _RouteId;
}
set {
SetProperty(ref _RouteId, value);
}
}
private int _MemberId = 0;
public int MemberId {
get => _MemberId;
set => SetProperty(ref _MemberId, value);
}
public double[] Point { get; set; }
private bool _IsCompleted;
public bool IsCompleted {
get => _IsCompleted;
set => SetProperty(ref _IsCompleted, value);
}
private bool _exit;
public bool Exit {
get => _exit;
set => SetProperty(ref _exit, value);
}
private double _Speed = 0;
public double Speed {
get => _Speed;
set => SetProperty(ref _Speed, value);
}
private double _HeartRate = 0;
public double HeartRate {
get => _HeartRate;
set => SetProperty(ref _HeartRate, value);
}
private double _Power = 0;
public double Power {
get => _Power;
set => SetProperty(ref _Power, value);
}
private double _Cadence = 0;
public double Cadence {
get => _Cadence;
set => SetProperty(ref _Cadence, value);
}
private int _TotalTicks = 0;
public int TotalTicks {
get => _TotalTicks;
set => SetProperty(ref _TotalTicks, value);
}
public bool exit = false;
public double Speed { get; set; }
public double HeartRate { get; set; }
public double Power { get; set; }
public double Cadence { get; set; }
public int TotalTicks { get; set; }
///// <summary>
///// 需要展示的属性
///// </summary>
//public string Prop { get; set; }
public double PreDistance { get; set; }
private double _PreDistance = 0;
public double PreDistance {
get => _PreDistance;
set => SetProperty(ref _PreDistance, value);
}
public double EndDistance { get; set; }
private double _EndDistance = 0;
public double EndDistance {
get => _EndDistance;
set => SetProperty(ref _EndDistance, value);
}
//public bool IsVirtual { get; set; }
@ -34,30 +88,84 @@ namespace OnlineUserPool.Model
/// <summary>
/// 功率体重比
/// </summary>
public double WeightKg { get; set; }
private double _WeightKg = 0;
public double WeightKg {
get => _WeightKg;
set => SetProperty(ref _WeightKg, value);
}
public int Competitionid { get; set; }
private int _CompetitionId = 0;
public int CompetitionId {
get => _CompetitionId;
set => SetProperty(ref _CompetitionId, value);
}
public bool Saved { get; set; }
private bool _Saved ;
public bool Saved {
get => _Saved;
set => SetProperty(ref _Saved, value);
}
//public bool ShowVirtual { get; set; }
public int FrameRate { get; set; }
public int RoomId { get; set; }
private int _FrameRate = 0;
public int FrameRate {
get => _FrameRate;
set => SetProperty(ref _FrameRate, value);
}
private int _RoomId = 0;
public int RoomId {
get => _RoomId;
set => SetProperty(ref _RoomId, value);
}
public DateTime? StartTime { get; set; }
public string Request { get; set; }
private string _Request;
public string Request {
get => _Request;
set => SetProperty(ref _Request, value);
}
public string Model { get; set; }
private string _Model;
public string Model {
get => _Model;
set => SetProperty(ref _Model, value);
}
public string ToString(int v)
{
if (v == 2)
{
return $"{ RouteId },{ MemberId },{ string.Join(":", Point) },{ Convert.ToInt32(IsCompleted) },{ Speed },{ PreDistance },{ EndDistance },{ WeightKg },{ Competitionid },{ Convert.ToInt32(Saved)},{ Power} ,{ HeartRate},{ Cadence},{ TotalTicks},{ FrameRate},{RoomId},{StartTime}";
return $"{ RouteId },{ MemberId },{ string.Join(":", Point) },{ Convert.ToInt32(IsCompleted) },{ Speed },{ PreDistance },{ EndDistance },{ WeightKg },{ CompetitionId },{ Convert.ToInt32(Saved)},{ Power} ,{ HeartRate},{ Cadence},{ TotalTicks},{ FrameRate},{RoomId},{StartTime}";
}
return $"{ RouteId },{ MemberId },{ string.Join(":", Point) },{ Convert.ToInt32(IsCompleted) },{ Speed },{ PreDistance },{ EndDistance },{ WeightKg },{ Competitionid },{ Convert.ToInt32(Saved)}";
return $"{ RouteId },{ MemberId },{ string.Join(":", Point) },{ Convert.ToInt32(IsCompleted) },{ Speed },{ PreDistance },{ EndDistance },{ WeightKg },{ CompetitionId },{ Convert.ToInt32(Saved)}";
}
public void Update(MsgModel model)
{
this.CompetitionId = model.CompetitionId;
this.EndDistance = model.EndDistance;
this.HeartRate = model.HeartRate;
this.IsCompleted = model.IsCompleted;
this.MemberId = model.MemberId;
this.Point = model.Point;
this.PreDistance = model.PreDistance;
this.RouteId = model.RouteId;
this.Speed = model.Speed;
this.WeightKg = model.WeightKg;
this.Saved = model.Saved;
this.HeartRate = model.HeartRate;
this.Cadence = model.Cadence;
this.TotalTicks = model.TotalTicks;
this.FrameRate = model.FrameRate;
this.RoomId = model.RoomId;
this.StartTime = model.StartTime;
this.Request = model.Request;
this.Power = model.Power;
this.Exit = model.Exit;
this.Model = model.Model;
}
}
}

View File

@ -1,10 +1,11 @@
using System;
using System.Collections.Generic;
using System.Text;
using Prism.Mvvm;
namespace OnlineUserPool.Model
{
public class ReceiveModel
public class ReceiveModel : BindableBase
{
/// <summary>
/// 命令类型,0ping命令1消息, 2设置客户端信息, 3观察者模式

View File

@ -44,31 +44,32 @@ namespace OnlineUserPool.Model
return string.Format($"{Ticks},{_Power},{_Speed},{_Distance},{_Cadence},{_HeartRate},{_Lat},{_Lon},{_Bearing}");
}
private static TargetData _target = new TargetData();
public static TargetData Read(string data)
{
string[] split = data.Split(',');
var target = new TargetData();
target.Ticks = int.Parse(split[0]);
target._Power = double.Parse(split[1]);
target._Speed = double.Parse(split[2]);
target._Distance = double.Parse(split[3]);
target._Cadence = double.Parse(split[4]);
_target.Ticks = int.Parse(split[0]);
_target._Power = double.Parse(split[1]);
_target._Speed = double.Parse(split[2]);
_target._Distance = double.Parse(split[3]);
_target._Cadence = double.Parse(split[4]);
if (!string.IsNullOrWhiteSpace(split[5]) && split[5] != "null")
{
target._HeartRate = int.Parse(split[5]);
_target._HeartRate = int.Parse(split[5]);
}
if (split.Length > 6)
{
target._Lat = double.Parse(split[6]);
target._Lon = double.Parse(split[7]);
_target._Lat = double.Parse(split[6]);
_target._Lon = double.Parse(split[7]);
if (split.Length >= 9)
{
target._Bearing = double.Parse(split[8]);
_target._Bearing = double.Parse(split[8]);
}
}
return target;
return _target;
}
}
}

View File

@ -29,11 +29,8 @@ namespace OnlineUserPool.ViewModels
private static object locker = new object();
public static System.Timers.Timer timer;
private static IHandle mapRecordRankingHander;
private Dispatcher dispatcher;
public ObservableCollection<MsgModel> Customers { get; private set; } =
new ObservableCollection<MsgModel>();
public ObservableCollection<MsgModel> Customers { get; private set; } = new ObservableCollection<MsgModel>();
private string _Title = "";
public string Title
{
@ -73,6 +70,8 @@ namespace OnlineUserPool.ViewModels
}
}
private const int ROOM_TIME_OUT = 60;
private const int TOTAL_PROCESS = 100;
//private IService _udpService;
public MainWindowViewModel()
@ -87,15 +86,13 @@ namespace OnlineUserPool.ViewModels
//初测程序关闭事件
Application.Current.MainWindow.Closing += MainWindow_Closing;
Title = $"{ IPAddress.Any }:{ ConfigHelp.UdpPort }";
dispatcher = Dispatcher.CurrentDispatcher;
WriteLine(DateTime.Now.ToShortDateString());
LogHelper.Init();
mapRecordRankingHander = new MapRecordRankingHander();//
//mapRecordRankingHander = new MultiUserHandle();
Log.Information($"初始化连接,当前地址:{ IPAddress.Any }:{ConfigHelp.UdpPort}");
new TcpService().RunServer(ReceivedData, CientDisconnected);
new TcpService().RunServer(ReceivedData, ClientDisconnected);
var _udpService = new UdpService();
_udpService.RunServer(ReceivedData);
@ -105,6 +102,18 @@ namespace OnlineUserPool.ViewModels
timer.AutoReset = true;
timer.Start();
Log.Information("等待连接");
ReleaseMemory();
}
private void ReleaseMemory()
{
var timers = new System.Timers.Timer(3333);
timers.Elapsed += (s, e) =>
{
GC.Collect();
};
timers.AutoReset = true;
timers.Start();
}
private void MainWindow_Closing(object sender, System.ComponentModel.CancelEventArgs e)
@ -151,16 +160,19 @@ namespace OnlineUserPool.ViewModels
{
var client = Clients.FirstOrDefault(n => n.Equals(remoteIpEndPoint));
var msg1 = (msg as MsgModel);
client.Competitionid = msg1.Competitionid;
client.Competitionid = msg1.CompetitionId;
client.Model = msg1.Model;
if (client.Model == "")
{
client.RoomId = msg1.RoomId;
}
if (msg1.V > 0)
{
client.V = msg1.V;
}
receiveMes.Add(msg1);
HandleGameRoomSaved(msg1);
}
@ -184,15 +196,6 @@ namespace OnlineUserPool.ViewModels
HandleGameRoom(msg);
}
break;
default:
break;
}
if (msg.CommandType == 0)
{
//client.ShowVirtual = msg.ShowVirtual;
}
else if (msg.CommandType == 1)
{
}
});
}
@ -208,6 +211,7 @@ namespace OnlineUserPool.ViewModels
GameRoomHelper.Set(RoomList.ToList());
}
}
private void HandleGameRoomSaved(MsgModel msg1)
{
//对战房间内的人保存处理
@ -336,7 +340,7 @@ namespace OnlineUserPool.ViewModels
Point = new double[] { 0d, 0d },
});
var temp = string.Join("|", list.Where(m => m.Competitionid == needSend.Competitionid).Select(m => m.ToString(2))) + "|";
var temp = string.Join("|", list.Where(m => m.CompetitionId == needSend.Competitionid).Select(m => m.ToString(2))) + "|";
List<RoomModel> rooms;
if (!string.IsNullOrEmpty(query.Name))
{
@ -547,8 +551,7 @@ namespace OnlineUserPool.ViewModels
SendGameRoomMessage(room);
}
}
private const int ROOM_TIME_OUT = 60;
private const int TOTAL_PROCESS = 100;
//处理房间内人loading进度
private void HandleGameRoomProcess(ReceiveModel msg)
{
@ -635,10 +638,6 @@ namespace OnlineUserPool.ViewModels
{
dispatcher.Invoke(() =>
{
//Customers.Clear();
//删除已经发送的数据
//receiveMes.Clear();
//移除5钟内连接不上的客户端
Clients.ToList().ForEach(item =>
{
@ -650,44 +649,45 @@ namespace OnlineUserPool.ViewModels
});
return;
}
lock (locker)
{
var msgs = CloneJson(receiveMes).ToList();
receiveMes.Clear();
dispatcher.Invoke(() =>
{
var msgs = receiveMes.ToList();
//加入虚拟人物消息
if (!CloseVirtualUser)
{
//加入虚拟人物消息
var virtualData = mapRecordRankingHander.GetVirtualUserData();
VirtualData = $"{virtualData.Count}";
WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "-当前在线人数:" + Clients.Count + "-当前虚拟人数:" + virtualData.Count);
#if DEBUG
WriteLine($"在线人:{Newtonsoft.Json.JsonConvert.SerializeObject(msgs)}");
//\r\n虚拟人{Newtonsoft.Json.JsonConvert.SerializeObject(virtualData)}
#endif
msgs.AddRange(virtualData);
}
//屏蔽房间模式的用户
var c = Clients.Where(c => string.IsNullOrEmpty(c.Model)).ToList();
SendMessage(c, msgs);
RemoveClientAdvanced(msgs);
AddCustomers(msgs);
receiveMes.Clear();
msgs.Clear();
msgs = null;
});
dispatcher.Invoke(() =>
{
Customers.Clear();
foreach (var item in msgs)
{
if (Customers.Any(c => c.MemberId == item.MemberId))
{
continue;
//更新虚拟人物信息
mapRecordRankingHander.RemoveEndAndAddNewVirtualUser(Clients.Count);
}
}
catch (Exception e)
{
Log.Error($"NotifyClient:{ e.Message }\r\n{ e.StackTrace }");
}
Customers.Add(item);
}
private void RemoveClientAdvanced(List<MsgModel> msgs)
{
//移除下线的客户端
for (int i = 0; i < msgs.Count; i++)
{
if (msgs[i].exit && msgs[i].MemberId > 0)//客户端退出,并且不是虚拟的人物
if (msgs[i].Exit && msgs[i].MemberId > 0)//客户端退出,并且不是虚拟的人物
{
//这个地方有严重的逻辑错误(虚拟的人物不能和真实的人用同一个名字)
var info = Clients.FirstOrDefault(n => n.MemberId == msgs[i].MemberId);
@ -697,8 +697,7 @@ namespace OnlineUserPool.ViewModels
}
}
}
//删除已经发送的数据
//receiveMes.Clear();
//移除5钟内连接不上的客户端
Clients.ToList().ForEach(item =>
{
@ -707,26 +706,40 @@ namespace OnlineUserPool.ViewModels
RemoveClient(item);
}
});
});
}
//更新虚拟人物信息
mapRecordRankingHander.RemoveEndAndAddNewVirtualUser(Customers.Count);
}
catch (Exception e)
private void AddCustomers(List<MsgModel> msgs)
{
Log.Error($"NotifyClient:{ e.Message }\r\n{ e.StackTrace }");
foreach (var item in msgs)
{
var client = Clients.FirstOrDefault(c => c.MemberId == item.MemberId);
if (client == null)
{
Customers.Remove(item);
continue;
}
var customer = Customers.FirstOrDefault(c => c.MemberId == item.MemberId);
if (customer != null)
{
customer.Update(item);
}
else
{
Customers.Add(item);
}
}
}
private void SendMessage(IList<HostModel> clients, List<MsgModel> msgModels)
private StringBuilder sb = new StringBuilder();
private void SendMessage(IList<HostModel> clients, List<MsgModel> list)
{
if (!clients.Any() || !msgModels.Any())
if (!clients.Any() || !list.Any())
{
return;
}
var clients1 = clients.ToList();
var list = CloneJson<List<MsgModel>>(msgModels);
var clients1 = clients.ToList();
foreach (var item in list)
{
item.PreDistance = Math.Round(item.PreDistance, 5);
@ -734,76 +747,79 @@ namespace OnlineUserPool.ViewModels
item.WeightKg = Math.Round(item.WeightKg, 2);
}
var jsonString = Newtonsoft.Json.JsonConvert.SerializeObject(list.Select(m => new {
m.RouteId,
m.MemberId,
m.Point,
m.IsCompleted,
m.exit,
m.Speed,
m.PreDistance,
m.EndDistance,
//m.IsVirtual,//后面要把这个字段过滤掉
m.WeightKg,
m.Competitionid,
m.Saved,
m.FrameRate,
}));
var data = Encoding.ASCII.GetBytes(jsonString);
var strV1 = string.Join("|", list.Select(m => m.ToString(1)));
if (!string.IsNullOrWhiteSpace(strV1))
{
strV1 += "|";
}
WriteLine(strV1);
WriteLine(strV1.Length.ToString());
var data1 = new NetworkData(strV1);
var data1ForUdp = new NetworkData(strV1.Last() == '|' ? strV1.Substring(0, strV1.Length - 1) : strV1);
SendDataSize = $"\t单客户端数据包V1{ data1.GetBytes().Length / 1000D }KB一共占用带宽{ data1.GetBytes().Length / 1000D * clients1.Count }KB压缩以后{ data1.GetBytes(true).Length / 1000D * clients1.Count }KB";
#region
foreach (var item in clients1)
{
try
{
if (item == null) continue;
if (item.V != 1 && item.V != 2)
{
var jsonString = Newtonsoft.Json.JsonConvert.SerializeObject(list.Select(m => new {
m.RouteId,
m.MemberId,
m.Point,
m.IsCompleted,
exit = m.Exit,
m.Speed,
m.PreDistance,
m.EndDistance,
//m.IsVirtual,//后面要把这个字段过滤掉
m.WeightKg,
Competitionid = m.CompetitionId,
m.Saved,
m.FrameRate,
}));
var data = Encoding.ASCII.GetBytes(jsonString);
item.Service.Send(data, data.Length, item.IPEndPoint);
data = null;
continue;
}
if (item.V == 1 && item.Service is UdpService)
{
sb.Clear();
foreach (var obj in list)
{
sb.Append(obj.ToString(1));
sb.Append("|");
}
var strV1 = sb.ToString();
var data1ForUdp = new NetworkData(strV1.Last() == '|' ? strV1.Substring(0, strV1.Length - 1) : strV1);
item.Service.Send(data1ForUdp.GetBytes(), data1ForUdp.GetBytes().Length, item.IPEndPoint);
data1ForUdp = null;
}
if(item.Service is TcpService)
{
NetworkData ddd = null;
NetworkData networkData = null;
if (item.V == 1)
{
ddd = data1;
sb.Clear();
foreach (var obj in list)
{
sb.Append(obj.ToString(1));
sb.Append("|");
}
var strV1 = sb.ToString();
var data1 = new NetworkData(strV1);
networkData = data1;
}
else if (item.V == 2)
{
var temp = string.Join("|", list.Where(m => m.Competitionid == item.Competitionid).Select(m => m.ToString(2))) + "|";
var watchList1 = string.Join('|', clients1.Where(c => c.IsWatch && c.Competitionid == item.Competitionid).Select(c => c.MemberId));
var e = string.Join("|", list.Where(c => c.RoomId > 0 || c.FrameRate > 0).Select(c => $"{c.MemberId},{c.RoomId},{c.FrameRate},{c.TotalTicks}"));
var strV21 = $"*l{{{ temp }}};w{{{ watchList1 }}};e{{{ e }}};#";
ddd = new NetworkData(strV21);
networkData = HandleGzipNetworkData(list,item);
}
else
{
continue;
}
bool isZip = item.Encoding == "gzip";
item.Service.Send(ddd.GetBytes(isZip), ddd.GetBytes(isZip).Length, item.IPEndPoint);
item.Service.Send(networkData.GetBytes(isZip), networkData.GetBytes(isZip).Length, item.IPEndPoint);
networkData = null;
}
}
catch (Exception e)
@ -812,9 +828,63 @@ namespace OnlineUserPool.ViewModels
Log.Error($"{ item.IPEndPoint.ToString() }:{ e.Message }\r\n{ e.StackTrace }");
}
}
clients1 = null;
#endregion
}
private NetworkData HandleGzipNetworkData(List<MsgModel> list, HostModel item)
{
sb.Clear();
foreach (var obj in list.Where(m => m.CompetitionId == item.Competitionid).Select(m => m.ToString(2)))
{
sb.Append(obj);
sb.Append("|");
}
sb.Remove(sb.Length - 1, 1);
var temp = sb.ToString();
sb.Clear();
foreach (var obj in Clients.Where(c => c.IsWatch && c.Competitionid == item.Competitionid).Select(c => c.MemberId))
{
sb.Append(obj);
sb.Append("|");
}
if (sb.Length > 0)
{
sb.Remove(sb.Length - 1, 1);
}
var watchList1 = sb.ToString();
sb.Clear();
foreach (var c in list.Where(c => c.RoomId > 0 || c.FrameRate > 0))
{
sb.Append($"{c.MemberId},{c.RoomId},{c.FrameRate},{c.TotalTicks}");
sb.Append("|");
}
if (sb.Length > 0)
{
sb.Remove(sb.Length - 1, 1);
}
var e = sb.ToString();
sb.Clear();
sb.Append("*l{");
sb.Append(temp);
sb.Append("};w{");
sb.Append(watchList1);
sb.Append("};e{");
sb.Append(e);
sb.Append("};#");
var strV2 = sb.ToString();
var data2 = new NetworkData(strV2);
return data2;
}
private void GameRoomDisConnectHandler(HostModel client)
{
////如果是在对战房间或者对战列表掉线执行,骑行阶段断开连接不移除房间信息
@ -828,15 +898,16 @@ namespace OnlineUserPool.ViewModels
o.List.Remove(needRemove);
}
});
var needRemoveList = RoomList.ToList().Where(c => c.List.Count == 0 && c.Status != 2).ToList();
foreach (var item in needRemoveList)
{
RoomList.Remove(item);
}
BroadCastGameRoomList();
}
void WriteLine(string str)
{
//Debug.WriteLine(str);
@ -859,7 +930,7 @@ namespace OnlineUserPool.ViewModels
return JsonConvert.DeserializeObject<T>(JsonConvert.SerializeObject(source), deserializeSettings);
}
private void CientDisconnected(EndPoint point)
private void ClientDisconnected(EndPoint point)
{
dispatcher.Invoke(() =>
{
@ -874,7 +945,7 @@ namespace OnlineUserPool.ViewModels
}
catch(Exception ex)
{
Log.Information("在CientDisconnected触发以后删除client时报错了,"+ ex.Message +", " + ex.StackTrace);
Log.Information("在ClientDisconnected触发以后删除client时报错了,"+ ex.Message +", " + ex.StackTrace);
}
});
}
@ -883,6 +954,7 @@ namespace OnlineUserPool.ViewModels
{
BeforeRemoved(client);
Clients.Remove(client);
Customers.Clear();
}
private void BeforeRemoved(HostModel client)