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

网络上的C#列表与字节数组效率,c#,arrays,list,unity3d,networking,C#,Arrays,List,Unity3d,Networking,好的,我正在尝试使用c#在unity3d中使用自建网络代码制作一个多人游戏 问题是,因为我使用的是原始tcp,所以我需要将所有内容转换为字节[],但我厌倦了使用Array.Copy。因为我保留了通过网络发送的每条消息的几个字节,作为一种消息标识符,可以用来解释我接收到的数据 所以我的问题是,为了使代码对我更友好,使用字节列表而不是字节数组是不是一个糟糕的想法,一旦我准备好要发送的消息,我就可以直接调用该列表中的。ToArray 这会对性能造成影响吗?在处理套接字时,作为一般规则:您通常应该使用超

好的,我正在尝试使用c#在unity3d中使用自建网络代码制作一个多人游戏

问题是,因为我使用的是原始tcp,所以我需要将所有内容转换为字节[],但我厌倦了使用Array.Copy。因为我保留了通过网络发送的每条消息的几个字节,作为一种消息标识符,可以用来解释我接收到的数据

所以我的问题是,为了使代码对我更友好,使用字节列表而不是字节数组是不是一个糟糕的想法,一旦我准备好要发送的消息,我就可以直接调用该列表中的。ToArray


这会对性能造成影响吗?

在处理套接字时,作为一般规则:您通常应该使用超大数组(
ArrayPool.Shared
在这里很有用),然后使用
Send
重载,该重载接受
字节[],int,int
(偏移量+计数),或者
ArraySegment
——这样您就不会不断地重复复制内容,并且可以重复使用缓冲区。不过,坦率地说:你也可以用一种方式去看;这是Kestrel使用的新IO API,它为您处理所有缓冲区管理,因此您不必这样做。在核心框架中,管道目前主要以服务器为中心,但作为“基石”的一部分,.NET5有望对此进行改进——然而,客户端管道包装器在
pipelines.Sockets.non-official
(在NuGet上)中提供


明确地说:不,在
列表上不断调用
ToArray()
并不是让缓冲区更方便的好方法;这可能会起作用,但可能会导致GC暂停,而且这是套接字代码中不必要的开销。

网络效率不取决于代码中的实现;如果您担心网络效率或速度,您可能会想一想udpI这里并不是在谈论网络的效率。我更担心的是是否使用列表而不是数组。复制函数会影响本地性能。好吧,我将研究一下您建议的一些内容。谢谢你的建议。