Является ли C # жизнеспособным для игрового сервера в реальном времени? [закрыто]

22

Большая часть вопроса в названии.

По сути, я начинаю разрабатывать многопользовательскую 2D-игру. Клиент (вероятно) будет в XNA, и я подумал, что я хотел бы спросить здесь, является ли хорошей идеей использовать C # также для разработки на стороне сервера.

Я предполагаю, что тот факт, что языком управляют, не является чем-то проблематичным, поскольку Java используется даже на игровых серверах MMO (поправьте меня, если я ошибаюсь), так есть ли причины избегать использования C # для этой цели? Мне нужно, чтобы он был быстрым и отзывчивым, общался по TCP, общался с SQL-сервером. И если нет причин избегать C #, как бы я развернул такой веб-сервер, это был бы .NET EXE-файл, работающий на сервере?

Заки немецкий
источник
2
Вы правы насчет сервера Java MMO .
Ricket

Ответы:

22

Не только жизнеспособный, но действительно хороший, по моему опыту. Я разработал несколько MMO-серверов, используя C #, и должен сказать, что никогда не жалел о выборе языка и платформы.

Существует множество отличных библиотек и инструментов для C # и .NET в целом - сети, журналирования, отображения O / R и т. Д. И, по сравнению с Java, C # более выразителен и менее многословен (хотя некоторые люди могут поспорить об этом, хотя .. )

«Накладные расходы» GC, которые пугают некоторых людей, на самом деле не проблема, если только вы не злоупотребляете ими с миллиардами выделений в секунду. Например, наш текущий сервер выделяет до 50 МБ / с при большой нагрузке, и GC не вносит заметных задержек. Нам действительно пришлось использовать пул объектов в стратегических местах, но самое главное, объекты, представляющие сетевые пакеты, объединяются в пул, а не собирают мусор. Тем не менее, даже если пул отключен, GC не самая большая проблема.

В качестве примера того, насколько крут C #, это то, что мы недавно реализовали. На нашем сервере запущено несколько служб WCF, которые игровой клиент использует для не критичных ко времени задач, и мы также используем их для администрирования сервера. Оказывается, очень просто сделать сервис WCF, чтобы просто возвращать наши игровые объекты вызывающей стороне. Итак, мы сделали это, затем создали небольшой плагин для LINQPad, который подключается к нашему серверу, и теперь мы можем запускать такие запросы, как

from character in Service.GetOnlineCharacters()
where character.LocationManager.LocationId==5 && character.Attributes.Level<10
select new { character.Id, character.Nick }

На живом сервере не меньше! Я не думаю, что вы можете сделать это с любой другой платформой. По крайней мере, не на пару дней работы.

Не берите в голову
источник
Мне особенно нравится использование LINQ, это делает сервер намного проще и быстрее в разработке.
Томас
26

Конечно, вы можете использовать C #.

Одна из самых больших проблем, которые следует учитывать с точки зрения производительности в C # или других экосистемах .NET, - это GC - .NET Framework предоставляет несколько разновидностей GC , в том числе «серверный» GC, о котором стоит узнать. Интеллектуальное управление памятью (например, путем объединения в пул) все еще является хорошим методом даже в управляемой среде.

Существует несколько надежных API-интерфейсов для взаимодействия с SQL, взаимодействия через TCP и т. Д. В C # как в рамках базовой инфраструктуры, так и через сторонних разработчиков, поэтому у вас не должно возникнуть никаких проблем.

Вы можете использовать ASP.NET или аналогичный, если вы действительно хотите, чтобы ваш сервер работал в сети; если вы просто хотите запустить процесс и прослушивать TCP-соединения, вы можете просто развернуть .exe и соответствующие зависимости на серверном компьютере, открыть соответствующие порты и запустить .exe.


источник
5

Я думаю, что это отличная идея. Язык, безусловно, способен на это, и особенно если это то, что вы знаете, не тратьте много времени на изучение нового языка только потому, что он «быстрее». Реальным узким местом вашего сервера будет задержка в сети; дополнительная миллисекунда или две, потому что вы использовали C # вместо C ++, ничего не изменит.

Ricket
источник
5
Реальный риск разработки игр (или любой другой разработки в реальном времени) на управляемых языках заключается не в том, что все занимает миллисекунду или две, а в том, что случайные кадры будут занимать десятки миллисекунд дольше, потому что GC решил все доработать. Поощрение сравнений, ориентированных на пропускную способность, с такими терминами, как «узкое место», вводит в заблуждение.
3

Если у вас все в порядке для развертывания в Windows, я настоятельно рекомендую его, особенно если ваш клиент - C #.

Не стоит недооценивать разработку игрового сервера. Даже создание простого параллельного сервера только для чата не является тривиальной задачей, и у вас скоро возникнет множество вопросов, касающихся параллелизма, блокировки, производительности и т. Д.

В качестве отправной точки я хотел бы, чтобы вы взглянули на эту страницу, которая в общих чертах объясняет, как выполнять параллельное программирование сокетов на нескольких платформах:

http://geekswithblogs.net/quension/archive/2006/06/30/83760.aspx

Если вы действительно серьезно относитесь к этому, я бы рекомендовал вам тщательно изучить сетевое программирование Unix Стивенса. Он ориентирован на сокеты C в Unix, но принципы одинаковы для любой другой платформы, включая .net.

Изменить: Это еще один замечательный ресурс, ориентированный на масштабируемость и производительность для одновременных серверов в .net. Это больше не доступно, но у наших друзей на машине обратного хода есть копия этого.

http://replay.waybackmachine.org/20080405220143/http://www.coversant.net/dotnetnuke/Coversant/Blogs/tabid/88/EntryID/10/Default.aspx


источник
1

Один «недостаток» заключается в том, что с C #, если вы хотите использовать его на нескольких платформах, вы должны быть очень осторожны, чтобы убедиться, что ваш код будет работать с моно. Если все, что вас волнует, это запускать его на одной платформе, а Windows - это та платформа, то у вас не должно быть проблем, как уже упоминали другие.

Кайл С
источник
Не забывайте, что MONO можно использовать для развертывания на других платформах. Я полагаю, что Second Life использует этот подход - их внутренние игровые сценарии фактически скомпилированы в .NET IL, но они развернуты в Linux AFAIK.
ShadowChaser