一种从Streams读取()数据的快速方法,无需使用多个线程
本文关键字:线程 方法 一种 Streams 数据 读取 | 更新日期: 2023-09-27 17:57:27
我正在开发一个用C#编写的在线FPS,它将使用P2P将玩家连接在一起,而不是使用集中式服务器。我需要一种快速的方法来读取每个流中的数据,然后在收到数据包时通知游戏。
class StreamReader
{
List<XStream> streams;
onPeerFound(XStream stream) {
System.Threading.Thread mthread = new System.Threading.Thread(targetthread);
mthread.start(stream);
}
void targetthread(object sender) {
XStream mstream = (XStream)sender;
while(isrunning) {
byte[] buffer = new byte[4086];
Array.Resize<byte>(ref buffer,mstream.Read(buffer,0,4086));
onPacketReceived.Invoke(buffer,mstream.remoteID);
}
}
}
有没有一种更快的方法可以做到这一点,而无需为每个流创建单独的线程?请注意,每个XStream还有一个DataAvailable属性,它返回接收缓冲区中的数据量。
使用异步IO?调用BeginRead,然后在线程池线程上获得回调,而不是Read。它仍然是线程化的,但您不必管理线程,而且它通常比每个请求的线程更高效。
那个数组。顺便说一下,调整大小很可怕。。。这很可能会做一个memcopy,除非迫不得已,否则你不想做。相反,你应该读取一个固定大小的缓冲区,并拥有在更高级别处理碎片或短消息的逻辑。