gpt4 book ai didi

c# - 为什么我的简单 lidgren 客户端使用这么多内存?

转载 作者:行者123 更新时间:2023-11-30 16:28:09 25 4
gpt4 key购买 nike

我有一个使用 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 .

关于c# - 为什么我的简单 lidgren 客户端使用这么多内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7313829/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com