为什么我简单的Liggren客户端会使用这么多内存?
作者:互联网
我有一个使用lidgren的简单客户端和服务器.客户端不断向服务器发送请求(消息由一个值为1的字节组成),客户端以“数据”(2000 ushorts)作为响应.它每秒大约执行20次.我将传入的数据存储在一个列表中,每次接收数据时都会清除该列表.问题是,我正在任务管理器中监视client.exe的内存使用情况,并且这种情况一直在上升.它在十分钟内上升到约100mb.我有时可以诱使垃圾收集器运行,但是似乎只减少了一点内存使用量.
这是我的服务器的代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Lidgren.Network;
using System.Threading;
namespace Client
{
class Program
{
static void Main(string[] args)
{
NetPeerConfiguration config = new NetPeerConfiguration("testapp");
config.UseMessageRecycling = true;
config.EnableMessageType(NetIncomingMessageType.DiscoveryRequest);
NetClient netClient = new NetClient(config);
netClient.Start();
netClient.DiscoverLocalPeers(12313);
List<ushort> mylist = new List<ushort>();
NetIncomingMessage msg;
while (true)
{
if (Console.KeyAvailable && Console.ReadKey().Key == ConsoleKey.G)
{
GC.Collect();
}
while ((msg = netClient.ReadMessage()) != null)
{
switch (msg.MessageType)
{
case NetIncomingMessageType.DiscoveryResponse:
netClient.Connect(msg.SenderEndpoint);
Thread.Sleep(1000);
//request data from server
NetOutgoingMessage nom = netClient.CreateMessage();
nom.Write((byte)1);
netClient.SendMessage(nom, NetDeliveryMethod.ReliableUnordered);
break;
case NetIncomingMessageType.Data:
mylist.Clear();
for (ushort n = 0; n < 2000; n++) mylist.Add(msg.ReadUInt16());
//request more data
NetOutgoingMessage nom2 = netClient.CreateMessage();
nom2.Write((byte)1);
netClient.SendMessage(nom2, NetDeliveryMethod.ReliableUnordered);
break;
default:
break;
}
netClient.Recycle(msg);
}
}
}
}
}
这是我的客户的代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Lidgren.Network;
using System.Threading;
namespace Server
{
class Program
{
static void Main(string[] args)
{
NetServer server = null;
NetPeerConfiguration config = new NetPeerConfiguration("testapp");
config.EnableMessageType(NetIncomingMessageType.DiscoveryRequest);
config.Port = 12313;
server = new NetServer(config);
server.Start();
NetIncomingMessage msg;
while (true)
{
while ((msg = server.ReadMessage()) != null)
{
switch (msg.MessageType)
{
case NetIncomingMessageType.DiscoveryRequest:
Console.WriteLine("Discovery");
server.SendDiscoveryResponse(null, msg.SenderEndpoint);
break;
case NetIncomingMessageType.Data:
byte mtype = msg.ReadByte();
if (mtype == 1)
{
//user is requesting an update.
NetOutgoingMessage nom = server.CreateMessage();
for (ushort n = 0; n < 2000; n++) nom.Write(n);
server.SendMessage(nom, msg.SenderConnection, NetDeliveryMethod.ReliableUnordered);
}
Thread.Sleep(50);
break;
default:
break;
}
server.Recycle(msg);
}
}
}
}
}
我已经尝试过使用.NET Memory Profiler,尽管我不太了解内部结构,但我可以最好地确定libgren正在将传入数据保留在某个地方.我最好的猜测是,太多的数据发送得太快并且正在客户端上的某个位置排队.会发生吗?服务器内存使用率稳定.
解决方法:
我最终在该项目的站点上收到Lidgren的回复(最初我应该只是在此处发布问题,但我对Google代码上的各个Lidgren页面感到困惑,并认为该项目已死).这被认为是Lidgren中的一个问题,并且今天可以进行修复(http://code.google.com/p/lidgren-network-gen3/issues/detail?id=65#makechanges).
标签:lidgren,network-programming,c 来源: https://codeday.me/bug/20191208/2087907.html