gpt4 book ai didi

网络上的 C# 列表与字节数组效率

转载 作者:行者123 更新时间:2023-12-04 09:36:52 24 4
gpt4 key购买 nike

好的,所以我正在尝试使用 c# 在 unity3d 中使用自建网络代码制作多人游戏,
问题是因为我使用的是原始 tcp,所以我需要将所有内容转换为字节 [],但我厌倦了使用 Array.Copy。因为我保留了通过网络发送的每条消息的几个字节,作为一种消息标识符,我可以用它来解释我收到的数据。
所以我的问题是,为了让这段代码对自己更友好,使用字节列表而不是字节数组是一个糟糕的主意,一旦我准备好要发送的消息,我就可以调用 .ToArray在那个名单上?
这对性能来说会很糟糕吗?

最佳答案

作为处理套接字时的一般规则:您通常应该使用超大数组(ArrayPool<byte>.Shared 在这里很有用),然后使用 Send接受 byte[], int, int 的重载(偏移量+计数),或ArraySegment<byte> - 所以你不会经常重新复制东西,并且可以重复使用缓冲区。但是,坦率地说:您也可以查看 "pipelines" ;这是 Kestrel 使用的新 IO API,它为您处理所有缓冲区管理,因此您不必这样做。在核心框架中,管道目前主要以服务器为中心,但希望在 .NET 5 中作为“Bedrock”的一部分进行改进 - 然而,客户端管道包装器在 Pipelines.Sockets.Unofficial 中可用(在 NuGet 上)。
明确地说:不,不断调用ToArray()List<byte>不是使缓冲区更方便的好方法;这可能会起作用,但可能会导致 GC 停顿,而且它在您的套接字代码中是不必要的开销。

关于网络上的 C# 列表与字节数组效率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62534051/

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