我正在研究用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属性,该属性返回接收缓冲区中的数据量。
答案 0 :(得分:3)
使用异步IO?而不是读取您调用BeginRead然后在线程池线程上回调。它仍然是线程化的,但你不必管理线程,它通常比每个请求的线程更有效。
顺便说一下,Array.Resize是可怕的...那很可能会做一个你不想做的memcopy,除非你必须这样做。相反,你应该读入一个固定大小的缓冲区,并具有处理更高级别的片段或短消息的逻辑。