2011-09-06 30 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

回答

相關問題