我拥有视频数据,并正在定期为许多客户生成新的帧。我从库中获取帧为IntPtr和一个表示字节数组大小的整数。目前,我将其转换为“内存”,并通过NetworkStream发送,一旦有了它,就实现了对相当大的缓冲区的零复制。
我想尝试使用SocketAsyncEventArgs执行相同的操作,以查看其性能是否更好,并尝试为多个客户端使用那些UserTokens。但是,我不知道如何告诉SocketAsyncEventArgs发送一个由IntPtr指向的内存块,其中一个int表示已知大小,同时保持零拷贝。似乎有些巧妙的编组或“ MemoryMarshal”应该可以解决问题,但我没有看到它。
您看到实现此目的的方法吗?
使用.Net Core 2.1 +
您可以使用SetBuffer(Memory<byte>)
see here设置存储器的缓冲区
public void SetBuffer (Memory<byte> buffer);
在.Net Framework中,您需要将其复制到byte[]
。但是正如上面的评论所述,这不会成为您的瓶颈。