2012-01-21 2 views
3

В настоящее время я планирую создать выделенный сервер на C# для игры XNA, в которой одновременно смогут подключаться до 32 игроков. У меня был опыт работы в сети с System.Net, но раньше мне не приходилось сталкиваться с довольно большим количеством игроков.Может ли Asyncronous TCP network быть лучшим вариантом для выделенного сервера с 32 игроками, играющими одновременно на C#?

Я знаю из сердца, что создание и уничтожение потоков (особенно для каждого игрока) не будет хорошей идеей, и я не уверен, использовать ли ThreadPool или нет, из-за «ожидания в строке, когда нет потоки доступны "природы. Итак, я решил (почти как мой единственный последний вариант) использовать Async для обработки большого количества клиентов.

Но я по-прежнему не уверен, является ли это мудрым выбором, или если я должен использовать что-то еще в соответствии с моими потребностями.

Извинения, если этот вопрос звучит мрачно, но я довольно сильно потрясен - помогите оценить!

+3

Вы не предоставили нам достаточно информации. Вы не сказали нам, если это игра в режиме реального времени, или если это пошаговая игра и т. Д. – jason

+0

Игра будет в реальном времени 2-м стрелком с разрушаемым «плиткой», основанной на мире. Таким образом, я буду ожидать битв загрузки сервера в разы. Я только планирую когда-либо отправлять полные мировые данные, когда клиент подключается/изменяет карту, и я планирую только отправлять изменения в мир на протяжении всего игрового процесса. – seandewar5

ответ

3

Если предел в игре составляет 32 одновременных пользователя и, возможно, несколько наблюдателей, то потоки в порядке, особенно если вы найдете их более легкими для кода, чем обратные вызовы. (Соответственно, вам придется coordinate access to shared data structures, и сложность этого может перевесить соответствующий дизайн event-based.)

Я, вероятно, даже не потрудился бы с пулом потоков всего за 32 одновременных пользователя.

Ограничения потоков для пропускной способности показывают около 100 потоков (в зависимости от деталей реализации, конечно). Если вы никогда не нацелились на 100 одновременных пользователей (например, это был бы довольно легкий IRC-сервер), тогда нет необходимости в асинхронной event-модели, если вы и ваша команда не будете более комфортно относиться к модели событий.

+0

Этот ответ действительно удивил меня (в положительной манере), потому что все, что я слышал по всему Интернету, это люди, говорящие о том, как постоянно создавать и уничтожать потоки для отправки/получения данных - это плохо; особенно при подключении 32 клиентов. Есть ли какие-то дополнительные вещи, которые мне нужно будет учитывать при работе с потоками для сервера, или это будет так же просто, как любой другой сервер с несколькими потоками, например, чат-серверы? Благодарю. – seandewar5

+1

Ну, я бы не предложил создать новый поток для каждого общения с пользователем, но поток на пользователя в порядке. Во всяком случае, соединения пользователей относительно долговечны. Я не знаю ни о чем другом, о котором вам нужно быть осторожным, но [рекомендация Йоахима] (http://stackoverflow.com/a/8949991/377270) использовать «стандартные» API-интерфейсы потоков делает тонны смысла , – sarnold

0

Что вам подходит, зависит от нагрузки, которую вы планируете. Наиболее эффективное решение, как правило, считается пулом потоков асинхронных процессоров, но это может быть просто излишним излишеством. Выберите самое простое решение, которое может выполнить эту работу.

2

Асинхронный подход является сильным, когда сервер связан с I/O. В ожидании ввода-вывода потребуется меньше ресурсов.

Подход потоков очень силен, когда сервер связан с ЦП. Он легко масштабируется до нескольких ядер или процессоров.

С 32 пользователями я бы с осторожностью рекомендовал использовать темы, по крайней мере, до тех пор, пока поддержка async не будет готова к прайм-тайм в .NET. Просто используйте потокобезопасные структуры, включенные в .NET для , все inter thread communication и не кодируйте свои собственные, и вы должны быть в порядке. Если вы решили записать свой собственный код, опыт подсказывает мне, что вы, вероятно, хуже, так как даже малейшая ошибка может привести к случайным ошибкам, которые очень трудно отследить.

+0

Спасибо за ваш ответ, если бы я мог выбрать два ответа на два ответа на мой вопрос, я бы тоже выбрал ваш, поскольку, увидев, что сервер будет более зависимым от процессора, вы также помогли мне выбрать потоковую передачу по Async (что, надеюсь, правильное направление, как вы, ребята, заявили), я компенсирую +1. – seandewar5