好的,我试着用unity3d中自建的网码,用c#制作一个多人游戏,
问题是,由于我使用的是原始tcp,所以我需要将所有内容转换为byte[],但是我厌倦了使用Array.Copy。因为我保留了通过网络发送的每条消息的几个字节,作为一种消息标识符,我可以使用它来解释接收到的数据。
所以我的问题是,为了使这段代码对我自己更友好,使用字节列表而不是字节数组是不是一个糟糕的主意,一旦我准备好了要发送的消息,我就可以调用列表上的.ToArray了吗?
这对表演来说会很糟糕吗?
发布于 2020-06-23 12:02:53
作为处理套接字的一般规则:您通常应该使用超大数组(ArrayPool<byte>.Shared在这里很有用),然后使用接受byte[], int, int (offset+count)或ArraySegment<byte>的Send重载,这样您就不会不断地重复复制东西,并且可以重用缓冲区。但是,坦率地说:您也可以查看“管道”;这是Kestrel使用的新的IO,它为您处理所有的缓冲区管理,所以您不必这么做。在核心框架中,管道目前主要以服务器为中心,但希望在.NET 5中作为“基石”的一部分加以改进--然而,客户端管道包装器在Pipelines.Sockets.Unofficial (在NuGet上)中是可用的。
明确地说:不,经常在ToArray()上调用List<byte>并不是让缓冲区更方便的好方法;这可能会起作用,但可能会导致GC阻塞,而且在您的套接字代码中也是不必要的开销。
https://stackoverflow.com/questions/62534051
复制相似问题