2011-05-23 52 views
1

我正在開發一個用C#編寫的在線FPS,它將使用P2P將玩家連接在一起,而不是集中式服務器。我需要一種快速的方式來讀取每個數據流中的數據,然後在收到數據包時通知遊戲。一種快速的方式從Streams讀取()數據而不使用多線程

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屬性,它返回接收緩衝區中的數據量。

回答

3

使用異步IO?而不是讀你調用BeginRead,然後在線程池線程上得到一個回調。它仍然是線程化的,但你不必管理線程,而且它通常比每個請求的線程更高效。

Array.Resize是可怕的方式......這將最有可能做一個你不想做的memcopy,除非你必須做。相反,你應該讀入一個固定大小的緩衝區,並有邏輯來處理更高級別的碎片或短消息。

+0

memcopy有什麼問題? – IDWMaster 2011-05-23 04:06:13

+1

複製東西並調整它們的大小會浪費內存帶寬(這很大但很有限)並導致堆碎片。運行時將修復堆碎片,但這樣做在性能方面不「免費」。 – Yaur 2011-05-23 04:15:22