Как написать игровой сервер на Qt?
====================================

 Всем привет,  
  

Есть задача написать игровой сервер для пошаговой стратегии. Планируемая загруженность 2000-2500 игроков пиковой нагрузки. Целевая платформа для сервера — *nix (скорее всего ubuntu server, может быть freebsd)  
  

Хотелось бы узнать, подойдет ли для этих целей Qt, и какие могут возникнуть подводные камни? Интересует следующее:  
  

Достаточно ли производителен данный инструмент в этих целях? (условимся, что у разработчика прямые руки)  
  

Сложность реализации по сравнению с альтернативными инструментами java/C++.   
  

Вообще вменяемость идеи. (может быть Qt не предназначен для этого и стоит посмотреть на другие инструменты?) 

 Я думаю, подойдет. При наличии прямых рук Qt никак не сдерживает быстродействие.   

  

Нативный код на C++/Qt точно будет работать быстрее и кушать меньше ресурсов, чем Java. Писать на чистом C++, на мой взгляд, сложнее, чем на Qt. Что касается других C++ библиотек, то найти достойную альтернативу непросто. Qt — простая в использовании, хорошо документированная, мощная библиотека общего назначения. В Qt есть много возможностей, которые можно задействовать при реализации вашей задачи (включая вышеупомянутый QTcpServer, а также средства для параллельных вычислений), что свидетельствует о том, что инструмент для задачи подходит.   

  

Сложность реализации зависит от опыта разработчика. Для разработчика с большим опытом работы с Qt писать с помощью Qt будет проще, чем с помощью других средств. Для Java-разработчика — наоборот. Никакой чрезмерной сложности в Qt нет, это точно. 

 Qt не предназначен для серверов. Это отличная библиотека для десктопных приложений.  

  

Если вы планируете взять Qt чтобы получить более удобное управление фукнциями для работы с сетью то вам стоит задуматься о boost.asio. Его асинхронный интерфейс куда более сложен, однако результат того стоит. Код получается очень быстрым и эффективным.  

  

Позволю себе полюбопытствовать насчет сетевого протокола. Будет ли это голый TCP или нечто более продвинутое. Если вы еще не определились или уже выбрали TCP могу порекомендовать посмотреть на xmpp. Он просто прекрасен. Правда на си есть не так уж много библиотек реализующих его, впрочем [libstrophe](http://strophe.im/libstrophe/) должно хватить. 

 Qt для серверов всё же не заточен.  

В последнее время пишу сетевые сервисы на Go, писать удобно, всё есть, всё быстро, современно. 

 Qt это и есть С++ только с MOC  

Ну сравните например с Minecraft — там сервер написан на Java (насколько Я помню) и все довольны :) 

 По производительности примерно одно и тоже, но Qt — после компиляции (MOC и GСС++) это машинный код. Java — это байт-код JVM.   

Для запуска Qt, вроде будет нужна libqt, для Java — JRE.  

библиотека java.net — очень мощный инструмент в прямых руках. 

 Применять низкоуровневый язык, когда можно обойтись управляемым, на мой взгляд расточительство, по отношению к рабочему времени программиста. Один маааааленький забытый где-то мемори лик обеспечит вам много часов отладки. Используйте C# (mono) или Java.  

  

Нагрузка 2000-2500 не такая уж запредельная. В крайнем случае сделаете кластер из n серверов. Это куда проще чем пытаться выиграть несколько процентов производительности используя низкоуровневый язык, при этом имея приличную вероятность сесть в лужу.  

  

Во избежание холиваров:  

Я не утверждаю, что любая программа на Java или C# работает также быстро как на C++. Я утверждаю что \_хорошая\_ программа на Java\C# работает ненамного дольше чем \_хороший\_ аналог на C++. Управляемые языки, так же как C++ имеют свои особенности, которые надо учитывать, и тогда производительность будет весьма приличной. 

 Если вы хорошо знаете Qt, то подводный камень только один — придется выложить денюжку при коммерческом использовании. 

 Qt — это универсальный инструмент для разработки высокоуровневых программных продуктов любого масштаба. **Что бы вам не говорили — не слушайте их.**  

  

Кьют прекрасен тем, что это обычный С++ с разными классными вещами, такими как signal&slot или qmetaobject. Почти для всех вещей там есть различные обертки. Например для std::map есть QMap. Есть куча силенная разного полезного функционала.  

  

К тому же, Qt построен таким образом, что в итоге получается максимально низкоуровневый байт-код для заданной платформы.  

  

Удачи :)