Быстрый способ чтения () данных из потоков без использования нескольких потоков - PullRequest
1 голос
/ 23 мая 2011

Я работаю над онлайн-FPS, написанным на C #, который будет использовать 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, которое возвращает объем данных в приемном буфере.

1 Ответ

3 голосов
/ 23 мая 2011

Использовать асинхронный ввод-вывод?вместо Read вы вызываете BeginRead, а затем получаете обратный вызов в потоке пула потоков.Он все еще многопоточный, но вам не нужно управлять потоками, и он обычно более эффективен, чем поток на запрос.

То, что Array.Resize страшно, кстати ... это скорее всего сделает memcopy, которыйВы не хотите делать, если вам не нужно.Вместо этого вы должны читать в буфер фиксированного размера и иметь логику для обработки фрагментов или коротких сообщений на более высоком уровне.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...