lidgren을 사용하는 간단한 클라이언트와 서버가 있습니다. 클라이언트는 지속적으로 서버에 요청을 보내고 (1 바이트 값 1로 구성된 메시지) 클라이언트는 "데이터"(2000 ushorts)로 응답합니다. 이것은 약 20 회/초입니다. 들어오는 데이터를 List에 저장하는데, 데이터가 수신 될 때마다 지워집니다. 문제는, 작업 관리자에서 client.exe에 대한 메모리 사용량을 감시하고 있습니다. 그것은 10 분 안에 약 100MB로 올라갔습니다. 때때로 가비지 수집기를 실행하도록 유도 할 수는 있지만 메모리 사용량을 조금만 줄이는 것으로 보입니다. 여기 왜 간단한 lidgren 클라이언트가 많은 메모리를 사용합니까?
내 서버의 코드입니다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 메모리 프로파일 러를 사용하여 시도하고 같은 내가 확인할 수있는 가장 좋은 libgren은 내 내부 데이터를 어딘가에 보유하고 있지만, 실제로 내부를 이해하지는 못합니다. 내 생각에 너무 많은 데이터가 너무 빨리 보내지고 클라이언트의 어딘가에 대기 중이다. 그런 일이 있습니까? 서버 메모리 사용이 안정적입니다.
프로젝트 관리자에게 연락하여 버그 신고서를 보내주십시오. – ChrisWue