我有一个客户服务器应用程序。HoloLens 2是我的客户端,使用UDP与服务器进行通信。我的MRTK分析器向我展示了应用程序会逐渐消耗内存,并且在2-3分钟后应用程序崩溃。我从服务器向HoloLens发送一些数据包。我试着打电话给GC,但也不起作用。我试图删除使用块和线程,但结果没有改变。我只使用一个端口。我是否应该连接、获取数据包并处理每个数据包的套接字?(这是一个非常糟糕的解决方案)不管怎样,我知道如何解决这个漏洞吗?
private void Socket_MessageReceived(Windows.Networking.Sockets.DatagramSocket sender,
Windows.Networking.Sockets.DatagramSocketMessageReceivedEventArgs args)
{
//Read the message that was received from the UDP client.
Stream streamIn = args.GetDataStream().AsStreamForRead();
MemoryStream ms = Task.Run(() => ToMemoryStream(streamIn)).Result;
byte[] msgData = ms.ToArray();
ThreadManager.ExecuteOnMainThread(() =>
{
Task.Run(() => HandleData(msgData));
});
}
private async Task<MemoryStream> ToMemoryStream(Stream input)
{
try
{
using (MemoryStream ms = new MemoryStream())
{
// Read and write in blocks of 4K.
byte[] block = new byte[0x1000];
while (true)
{
int bytesRead = input.Read(block, 0, block.Length);
if (bytesRead == 0)
{
return ms;
}
ms.Write(block, 0, bytesRead);
}
}
}
finally { }
}
private async System.Threading.Tasks.Task HandleData(byte[] data)
{
using (Packet packet = new Packet(data))
{
int packetLength = packet.ReadInt();
data = packet.ReadBytes(packetLength);
}
ThreadManager.ExecuteOnMainThread(() =>
{
using (Packet packet = new Packet(data))
{
int packetId = packet.ReadInt();
// Call appropriate method to handle the packet
_packetHandlers[packetId](packet);
}
});
} 内存工具的更新:

发布于 2022-04-19 13:53:44
对于这个版本,报告使用了统一更新版本和流类。下面是显示建议的帖子:https://forum.unity.com/threads/hololens-udp-client-with-datagramsocket-and-memory-leak.583816/
"Stream streamIn = args.GetDataStream().AsStreamForRead();
IL2CPP构建中的大量内存泄漏。重写消息接收代码以不使用Stream类,如下面的示例所示,消除了内存泄漏,在Unity2018.2.18f1中进行了测试“
代码(CSharp):
using (var reader = args.GetDataReader())
{
var buf = new byte[reader.UnconsumedBufferLength];
reader.ReadBytes(buf);
string message = Encoding.UTF8.GetString(buf);
}https://stackoverflow.com/questions/71694830
复制相似问题