Привет.
Мой вопрос может показаться странным, но чем отличается серверный и клиентский программист в геймдеве ? Я не очень понимаю когда люди ищут серверного программиста.
Я всегда думал, что вот если писать оффлайновый клиент, то это тот же чел что и серверный программист, просто серверный пишет логику на сервере. Не ? Объясните мне пожалуйста, какую работу выполняет серверный программист.
Заранее благодарю.
Gladiator
> чем отличается серверный и клиентский программист в геймдеве ?
я одно время был серверным программистом, занимался всяким говном, базами данных, сервисами
без этого ММО никак
теперь просто игровой программист, ковыряю логику и на сервере, и на клиенте
Серверный программист решает задачи по реализации мультиплеера в игре - сервера и БД, их архитектура и обслуживание, передача данных по сети и их обработка с минимальным лагом, интеграция с клиентом. Вплоть до деплоя серверов (это уже ближе к DevOps).
Sh.Tac.
MANAB
Спасибо за ответы.
MANAB
Если архитектура игры предполагает авторитарный сервер, ведь логика игры пишется на сервере. Этим занимается не серверный программист ?
Гладиатор, многое зависит от жанра игры. Например, если взять 3д шутер, где всё происходит очень быстро, то в целях минимизации передачи данных логика игры выполняется и на клиенте и на сервере. Часть этой логики реализована в скриптах, поэтому отделить серверный код от клиентского невозможно. А если взять шахматы, где клиенты передают "е2-е4" раз в минуту, то там, конечно, вся логика может только на сервере выполняться. Зато, серверному программисту не придётся париться с графикой, моделями, видеокартами, операционными системами, движками, всякими OpenGl, Direct3d, Vulcan, ему до фонаря разрешение экрана, тип устройства и прочая ересь. Но зато надо знать серверные технологии: базы данных, хранение паролей, интернет протоколы, многопоточность - всё то, от чего зависит пропускная способность сервера.
Gladiator
> логика игры пишется на сервере
очевидно логика, равно как и сеть не может быть только на сервере
второй момент, когда одну фичу реализуют два чела получается много хуже, чем когда один, но на сервере и на клиенте сразу
в игровых проектах лучше когда программисты "клиент-серверные", т.е. могут и там, и там
Sh.Tac.
> второй момент, когда одну фичу реализуют два чела получается много хуже,
разумеется хуже ведь надо платить две зарплаты и две семьи кормить , вместо одной
с другой стороны один клиент-серверный может потребовать две зарплаты первая за клиент а вторая за сервер чтоб кормить одну семью
В целом понятно. Т.е. главное отличие сетевого программиста от клиентского в понимании сети, умении правильно подбирать сетевую архитектуру для того или иного типа игр, знание сетевых движков(возможно) и т.д. ?
Sh.Tac.
> второй момент, когда одну фичу реализуют два чела получается много хуже, чем
> когда один, но на сервере и на клиенте сразу
>
> в игровых проектах лучше когда программисты "клиент-серверные", т.е. могут и
> там, и там
У меня из-за такого смешения получалось работать гораздо медленнее, чем если только одним заниматься. В голове больше информации приходилось держать. Но тогда я еще неопытный был, может сейчас было бы по другому.
Gladiator
> В целом понятно. Т.е. главное отличие сетевого программиста от клиентского в
> понимании сети, умении правильно подбирать сетевую архитектуру для того или
> иного типа игр, знание сетевых движков(возможно) и т.д. ?
Нет, серверный программист обычно использует те архитектуры, которые он знает, будь то php, node.js, java, .net, ruby, C++ или что угодно ещё. Писать сервер отдельно есть смысл только для определённых типов проектов, где ничего не надо просчитывать на клиенте, например, agar.io. Там вся логика выполняется только на сервере, а клиенту постоянно передаются позиции и размеры ограниченного количества кружков.
Если у тебя уровни со скриптами, написанными в Юнити или в Унриле, то и сервер у тебя должен соответственно запускать тот движок с уровнями и скриптами. И клиент запускает те же скрипты, таким образом, если игрок попадает в зону, которая запускает скрипт Х, то сервер запускает этот скрипт и клиент тоже у себя запускает этот скрипт, когда игрок попадает в эту зону. Обычно, можно делать скрипты которые запускаются только на сервере или только на клиенте. Если это какая-то чисто визуальная анимация (фейерверк), то запускать его на сервере смысла нет. Для таких игр не нужен серверный программист, так как движок сам реализует взаимодействие между клиентами и сервером. Надо просто чтобы программист знал все тонкости синхронизации состояния игры между сервером и клиентами средствами, предоставляемыми данным движком.
ardru
> Писать сервер отдельно есть смысл только для определённых типов проектов
> Если у тебя уровни со скриптами, написанными в Юнити
было дело, как-то решил что проект на юнити весьма определённый : )
страшно было за надёжность и производительность сервера на котором под линухом крутились бы инстансы безголовой юньки, дальше я посмотрел, что юнька не предоставляет никаких алгоритмов сетевой синхронизации, без чего шутер просто невозможен
ну вернее можно только что-то типа "Батлы" где сильно похоже, что всем управляет клиент, а сервер только пересылает команды
пришлось ваять авторитарный сервер на плюсах, но я не учёл несколько важных моментов, из-за чего затея провалилась:
1. код пришлось писать два раза, на С++ и на C#
2. поскольку я был серверный программист, меня не особо интересовало как оно в результате работает на юньке, это типа задача клиентского программиста
3. у меня не было опыта в шутерах, но была идея экономить трафик, и я зачем-то ещё сделал безтиковую симуляцию, т.е. мне на сервер приходит контрол с таймстемпом tN, я беру предыдущий и симулирую на интервале tN - tN-1 одним махом, такое просто не может работать правильно
на юнити как пишется клиент и сервер ? на одном и том же языке юнити-прогание си-шарп , или на разных языках типа клиент=си-шарп а сервер вот прям обязан на си++?
Rikk
> на юнити как пишется клиент и сервер ?
юнька и близко не клиент-серверный движок
поэтому там изначально зоопарк "серверных решений":
Photon C#
SmartfoxServer Java
UnityPark Erlang (домен не оплачен, антивирус агрится, окочурились видать)
Rikk
Зависит от игры. Можно и на PHP или node.js или еще на чем, сериализируй/десериализуй данные по сети просто одинаково. Просто часть общей логики, которую можно вынести было бы в общую dll, придется дублировать, что может быть чревато багами.
Я для юньки писал и на C# и на PHP, как веб так и runtime, все зависит от типа игры.
В по настоящему массовых играх на сервере должно все работать асинхронно. Большинство то программистов такому не обучено. Более того, даже не видят в этом проблемы. Она их убивает, а они ее не видят.
Если игроков порядка 300, на них еще можно завести по потоку на каждого, если больше - надо действовать иначе.
Тема в архиве.