2011-09-06 29 views
3

我有一个简单的客户端和使用lidgren的服务器。客户端不断向服务器发送请求(消息由1个字节组成,值为1),客户端以“数据”(2000个ushorts)响应。它每秒钟处理约20次。我将传入的数据存储在List中,每次收到数据时都会清除它。问题是,我正在监视任务管理器中client.exe的内存使用情况,并且它正在进行中。它在十分钟内涨到了大约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); 
       } 

      } 

     } 

    } 
} 

,这里是我的客户代码:我一直在使用.NET内存分析器尝试和尽我所能确定

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); 
       } 
      } 
     } 
    } 
} 

libgren坚持我的传入数据的地方,虽然我不是很了解内部。我最好的猜测是太多的数据发送得太快,并且正在客户端的某个地方排队。这是否发生?服务器内存使用情况稳定。

+0

您可能有更好的机会联系项目维护人员并向他们发送bugreport。 – ChrisWue

回答

相关问题