2011-09-06 5 views
3

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은 내 내부 데이터를 어딘가에 보유하고 있지만, 실제로 내부를 이해하지는 못합니다. 내 생각에 너무 많은 데이터가 너무 빨리 보내지고 클라이언트의 어딘가에 대기 중이다. 그런 일이 있습니까? 서버 메모리 사용이 안정적입니다.

+0

프로젝트 관리자에게 연락하여 버그 신고서를 보내주십시오. – ChrisWue

답변

3

프로젝트 사이트의 Lidgren으로부터 응답을 얻었습니다. (처음에는 문제를 게시 했어야했는데 Google 코드의 lidgren 페이지에서 혼란스러워하고 프로젝트가 죽었다고 생각했습니다). 이것은 lidgren의 문제로 인정되었으며 오늘 수정판을 사용할 수있게되었습니다 http://code.google.com/p/lidgren-network-gen3/issues/detail?id=65#makechanges.

관련 문제