Модераторы: LSD, AntonSaburov

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сервер для онлайн - игры 
:(
    Опции темы
Temdegon
Дата 23.1.2009, 16:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 429
Регистрация: 11.10.2008
Где: Minsk

Репутация: 7
Всего: 9



Мой друг пишет браузерную онлайн-игру. Сам движок игры написан на флеше. Сервер для его игры на данный момент написан на PHP. Точнее сервер не один, а их несколько. Один для синхронизации действий игроков, другой управляет ботами и т.д. Но производительность ПХП оставляет желать лучшего, да к тому же в нем нет поддержки многопоточности, что сильно сказывется в таких задачах. Вот и встал вопрос переписать всю серверную часть на чем-то лучшем, чем PHP. Вопрос, какой язык выбрать? Эффективно ли будет здесь использование java? Стоит вопрос писать на C++ или на Java. Если выберут java (опыта в таких делах у меня нет), то писать буду я. Если С++, то начинающий программист на Си. Не у кого на фирме нет опыта в написании такого рода кода. Все убеждены, что Java - медленный и жрущий память язык. Вопрос не в том, как склонить всех к Java. Нужно взвесить все за и против (время разработки на Си\java, сложность реализации, эффективность). Какие есть аргументы в пльзу Си или Java? На чем чаще пишут серверы и почему? 
Мои аргументы такие: в Java хорошо реализована многопоточность, все что будет нужно для реализации уже есть в стандартных библиотеках, скорость исполнения за счет jit будет сравнима с Си и врядли будет медленнее более чем в 2 раза. Памяти будет есть больше, но это не критично. Времени на разработку уйдет намного меньше. 
Может я не знаю каких-то веских плюсов\минусов? подскажите плиз.
Другой вопрос, как это будет выглядеть на Java? это долежн быть просто обычный jar, который можно запустить под линуксом без установки Tomcat? Или это делается как-то по другому? Нужен ли Tomcat или достаточно просто jvm?
Насколько это сложно и какую литературу предварительно почитать?
PM MAIL   Вверх
golubsv
Дата 23.1.2009, 16:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 4.8.2008

Репутация: нет
Всего: нет



http://www.electro-server.com/
http://www.smartfoxserver.com/
http://www.projectdarkstar.com/ https://games-darkstar.dev.java.net/ (open source но вроде сыроват пока ещё)
ну и подобное поискать можно

Это сообщение отредактировал(а) golubsv - 23.1.2009, 16:30
PM MAIL   Вверх
SoulKeeper
Дата 23.1.2009, 16:50 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 375
Регистрация: 14.1.2007
Где: Ukraine, Lviv.

Репутация: 11
Всего: 15



Если писать будет начинающий программист на C++, то вы замучаетесь его писать и отлаживать.
Берите сразу джаву и не парьтесь.

Как будет выглядесть: Нет никакого смысла гонять HTTP траффик, откройте пару портов и делайте прямое соединение.
Как следствие, можно (да и нужно) обойтись без томката. В результате - обычный .jar работающий под windows\linux\solaris\etc...

P.S. Постыдились бы после Flash"а и PHP говорить о скорости и прожорливости smile 

PM MAIL   Вверх
Temdegon
Дата 23.1.2009, 17:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 429
Регистрация: 11.10.2008
Где: Minsk

Репутация: 7
Всего: 9



Насчет прямых соединений - так оно и будет. Та часть, которую нужно переписать работает через сокет. А насчет 
Цитата

Постыдились бы после Flash"а и PHP говорить о скорости и прожорливости

ну просто как бы хотят сделать качественно, т.сказать на века. Боятся, что если написать на java, то через некоторое время начнутся проблемы и придется еще раз переписывать на Си. Я конечно пытаюсь защищать позиции java, но я в меншинстве.
PM MAIL   Вверх
vdweller
Дата 23.1.2009, 17:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 35
Регистрация: 1.2.2008

Репутация: нет
Всего: нет



Цитата

Если писать будет начинающий программист на C++, то вы замучаетесь его писать и отлаживать.
Берите сразу джаву и не парьтесь.


Абсолютно согласен, если нет человека который хорошо знает C/C++ то лучше не смотреть в ту сторону.

Цитата

ну просто как бы хотят сделать качественно, т.сказать на века. Боятся, что если написать на java, то через некоторое время начнутся проблемы и придется еще раз переписывать на Си. Я конечно пытаюсь защищать позиции java, но я в меншинстве.


Если опыта нет, то все равно придется переписывать значительную часть системы в случае если игра станет популярна. Насчет того что начнутся проблемы - вон линейковские сервера на яве и ничего, работают себе.
PM MAIL   Вверх
SoulKeeper
Дата 23.1.2009, 17:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 375
Регистрация: 14.1.2007
Где: Ukraine, Lviv.

Репутация: 11
Всего: 15



На какую нагрузку расчитываете?

Это сообщение отредактировал(а) SoulKeeper - 23.1.2009, 17:27
PM MAIL   Вверх
Temdegon
Дата 23.1.2009, 17:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 429
Регистрация: 11.10.2008
Где: Minsk

Репутация: 7
Всего: 9



Ну, я думаю 1000 игроков онлайн это вполне реально. Но дополнительная нагрузка на сервер это боты. Их АИ тоже реализован на сервере. Сам по себе алгоритм ботов не сложный, но их может быть много.
PM MAIL   Вверх
SoulKeeper
Дата 23.1.2009, 17:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 375
Регистрация: 14.1.2007
Где: Ukraine, Lviv.

Репутация: 11
Всего: 15



1000 игроков потянет довольно легко. Главное в коде на начудить smile

Это сообщение отредактировал(а) SoulKeeper - 23.1.2009, 17:39
PM MAIL   Вверх
Temdegon
Дата 23.1.2009, 17:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 429
Регистрация: 11.10.2008
Где: Minsk

Репутация: 7
Всего: 9



Ну до того как я начну "чудить", надо сначала детально разобраться, как это уже реализовано на ПХП. Пока я смотрю в код этих серверов, как будто пытаюсь читать книгу на китайском. 
PM MAIL   Вверх
vdweller
Дата 23.1.2009, 17:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 35
Регистрация: 1.2.2008

Репутация: нет
Всего: нет



Цитата(SoulKeeper @ 23.1.2009,  17:37)
1000 игроков потянет довольно легко. Главное в коде на начудить smile

И с базой тоже. С ней даже проще начудить чем с кодом по моему.
PM MAIL   Вверх
chand0s
Дата 23.1.2009, 18:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 19.2.2007

Репутация: 1
Всего: 3



Вы же вообще ничего не сказали - ни какое железо у вас, ни насколько тяжелая функциональность и т.д.

Напишите прототип на Java, разверните его на предполагаемом железе, нагрузите "ожидаемой" нагрузкой и посмотрите, устраивает вас производительность или нет.
PM MAIL   Вверх
Temdegon
Дата 23.1.2009, 18:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 429
Регистрация: 11.10.2008
Где: Minsk

Репутация: 7
Всего: 9



Цитата

Вы же вообще ничего не сказали - ни какое железо у вас, ни насколько тяжелая функциональность и т.д.

Я ничего не сказал, ибо это пока не известно. В существующем ПХП-коде я только начал ковыряться, и пока нифига там не понимаю. Железо тоже пока не известно. Все тестируется на чужом сервере, на котором висят кроме этого несколько других сайтов. Но естественно потом все это будет переноситься на нормальный сервер.
Цитата

Напишите прототип на Java.....

А как мне это сделать? клиенты - флеш. У меня нету парка машин, чтоб посадить туда сотню тестеров и тестировать под нагрузкой.

Проблема в том, что я не знаю как мне так переписать только сервер, чтоб не пришлось весь проект, который уже вполне нормально работает, ставить с ног на голову.

Вот еще какой вопрос:
Есть массив (точнее, это скорее коллекция), который загружается из БД. Там ключ - это команда (грубо - действие игрока), а значение - имя функции, которую нужно вызвать для этой команды.
Но сами функции не просто лежат в php-файле, а тоже грузятся из базы. Получается, если девелопер добавляет новую функцию, он просо добавляет в базу текст функции,  добавляет в клиент действие, которое будет использовать новую функцию, и посылает серверу команду перечитать список функций. Получается что можно обновить функционал сервера без перезагрузки самого сервера. Как мне реализовать что-то похожее на Java?
PM MAIL   Вверх
SoulKeeper
Дата 23.1.2009, 18:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 375
Регистрация: 14.1.2007
Где: Ukraine, Lviv.

Репутация: 11
Всего: 15



Копать в сторону Groovy\BeanShell\Java Compiler API + tools.jar и класслоадеров.

А вообще держать код в базе мега глупо... Дебаггеры не будут работать, читабельность на нуле... IDE тоже не получится использовать.
PM MAIL   Вверх
ivg
Дата 23.1.2009, 19:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Autonomous R&D
**


Профиль
Группа: Участник
Сообщений: 686
Регистрация: 8.2.2006
Где: Екатеринбург

Репутация: 33
Всего: 81



Цитата(Temdegon @  23.1.2009,  20:34 Найти цитируемый пост)
Получается что можно обновить функционал сервера без перезагрузки самого сервера. Как мне реализовать что-то похожее на Java? 

Можно воспользоваться скриптовыми возможностями Java. Если производительность во главе угла - то "hot redeploy"(замена/добавление классов без остановки приложения). Это практически стандартная фича всех серверов приложений. Пишете свой класслоадер, который можно, кстати, научить грузить классы, в том числе, прямо из базы. При получении команды на перезагрузку классов, удаляете все ссылки на объект класслоадера, на загруженные им классы и на объекты этих классов. Лучше, конечно, вообще не позволять получать подобные ссылки в коде классов загруженных другими класслоадерами (за исключением того кода, в котором вы внимательно эти ссылки подчистите). Далее создаете новый объект вашего класслоадера, грузите им необходимые классы, обновляете Map<команда, действие>. Старые классы вместе с объектом класслоадера будут удалены JVM, поскольку на них не останется ссылок, типа как в GC (правда я не уверен, что в случае с классами, этим GC занимается).

Цитата(SoulKeeper @  23.1.2009,  19:37 Найти цитируемый пост)
1000 игроков потянет довольно легко.
 Зуб даёте? smile
Цитата(SoulKeeper @  23.1.2009,  20:58 Найти цитируемый пост)
А вообще держать код в базе мега глупо... Дебаггеры не будут работать, читабельность на нуле... IDE тоже не получится использовать. 
 Вспоминаем отладку из под IDE для серверов приложений... smile


PM MAIL   Вверх
Temdegon
Дата 23.1.2009, 19:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 429
Регистрация: 11.10.2008
Где: Minsk

Репутация: 7
Всего: 9



Млин, нигде не могу найти примеров серверов. Все что попадается это однотипные примерчики, где клиент посылает пару байт, сервер их читает и посылает ответ.

Ума не приложу, как это красиво перевести на многопоточтоность. Оригинальный код работает в общих чертах так:
в цикле опрашивается порт. Если есть новые запросы, то идентефикатор ищется в массиве уже имеющихся идентефикаторов что бы узнать новое это соединение или нет. Если новое то оно акцептится и добавляется в массив. Если старое, то читается его сообщение, парсится и выполняется нужная команда. Когда команда выполниалсь, результат рассылается всем, кто находится на той же локации. 
На пример на локации 5 человек. А бьет Б. он посылает серверу команду, сервер проверяет все условия, вычиляет сколько надо снять здоровья, прочности вещи и т.п, по идентефикатору определяет кто еще находится на этой же локации, и рассылает всем флеш-клиентам команду, что нужно проанимировать удар. 
Вопрос по многопоточности.
Изначально я представлял себе так: для каждого нового соединения (пользователя) создается отдельный поток, в котором уже обрабатываются все его команды. Но насколько это хорошее решение? Может все-таки делать так же как уже сделано, т.е. все в одном потоке?
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1358 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.