ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

为什么我简单的Liggren客户端会使用这么多内存?

2019-12-08 01:06:23  阅读:212  来源: 互联网

标签:lidgren network-programming c


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

标签:lidgren,network-programming,c
来源: https://codeday.me/bug/20191208/2087907.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有