Есть желание сделать игру типа "платформер" с возможностью сетевой игры. Игра должна представлять собой динамичную стрелялку. Все подключившиеся игроки распределяются по картам, на каждой карте по 10 - 20 игроков. Кроме игроков на карте будут однотипные объекты - препятствия.
Как выглядит клиентская часть:
1) модуль, отвечающий за отрисовку событий на карте;
2) модуль, отвечающий за обработку действий пользователя;
3) модуль для общения с серверной частью.
Каким предполагается протокол клиент-серверного взаимодействия:
1) клиент подключается к серверу;
2) клиент получает копию карты (со всеми объектами, игроками, их оружием и т.п.);
3) клиент сообщает о действиях пользователя;
4) клиент получает сообщение о действиях других пользователей и обновляет свою копию карты.
Требования к серверной части:
1) не должно быть заметных зависаний;
2) у каждого игрока должна быть актуальная информация о карте;
3) должна вестись достоверная статистика игрока (число побед / число поражений);
4) серверная часть должна быть максимально компактной (начать планируется с бесплатного / недорогого хостинга).
Какие я вижу подходы к решению задачи, их плюсы и минусы а) Сервер на основе сокетов, осуществляющей пересылку сообщений между игроками без валидации. Выполняются требования: 1, 2, 4. б) Сервер, осуществляющий проверку действий пользователя, опираясь на эталон карты, который хранит у себя (в ОЗУ, ПЗУ, БД). Если хранить в ОЗУ - его может не хватить на всех, если в ПЗУ или БД - дополнительное время.
Выполняются требования: 3. в) Сервер на основе сокетов, осуществляющей пересылку сообщений между игроками. Валидация действий игроков осуществляется путем голосования (например, если какой-либо персонаж убит, каждый клиент генерирует соответствующее событие).
Выполняются требования: 1, 2, 3, 4.
Чего я боюсь:
1) игрокам будет неприятно играть в игру, которая притормаживает;
2) игроки начнут жульничать (использовать оружие, которого у них нет и т.п.).
Старался объяснить проблему как можно понятнее, и хоть получилось не очень, я надеюсь на адекватные советы. В чем я ошибаюсь, чего я не учел?
Stalker_RED: карт будет много. На одной карте поместятся только 10-20 пользователей, для них карта будет одна. Хочется надеятся на посещаемось в несколько сотен пользователей онлайн.
Вероятно вы переоцениваете вычислительную сложность модели. VDS за 300 рублей в месяц скорее всего покроет ваши потребности, если не делать на нем лишнего. Если игра вдруг начнет пользоваться популярностью, тогда можно будет вложиться в более дорогой сервер.
3 вариант может оказаться сложно реализуемым. Теоретически сделать это невозможно. Однако с некоторыми допущениями алгоритмы есть см. habrahabr.ru/post/222825/.
В принципе, можно забить на жульничество пока это не станет проблемой. Это увеличит шансы на то что игра увидит свет. guide.agilealliance.org/guide/simple-design.html
Я сейчас скажу страшную вещь, за которую завтра мне очень стыдно.
Скачай исходники какой-нибудь сетевой игры и попробуй в них покопаться. Например, движок первого квейка не только в открытом доступе, но и перелопачен вдоль и поперёк. Даже не так. Сейчас почти все движки в открытом доступе и бесплатно. И большинство озвученных проблем в них уже решены стандартным для них способом.
Если прям самому хочется, то рекомендую попробовать самый интересный и сложный вариант:
И на клиенте и на сервере находятся копии "мира" со всеми npc и игроками. Причём, игроками тоже управляет ИИ. Вернее, не управляет, но выполняет просчёт их действий, как если бы управлял. И, если действия игрока отличаются от действий, предсказанных ИИ, то это различие отсылается на сервер, а если угадал, то ничего не отсылается. Самый простой вариант - предполагать, что в следующем "кадре" игрок будет делать то же самое, что и в предыдущем.
Это может быть довольно сложно реализовать и все "миры" нужно периодически синхронизировать. Зато, если связь прервётся или пакеты потеряются, ИИ просто заменит потерянные действия игрока на те, которые сочтёт нужным и кратковременные проблемы с сетью не испоганят всю игру.
Если игра вдруг начнет пользоваться популярностью, тогда можно будет вложиться в более дорогой сервер...пока что такой необходимости не вижу, по крайней мере так было когда я в азино 777 играл на реальные деньги.