Интересует такая штука как синхронизация мультиплеера в стратегиях (теория с псевдокодом будет очень к стати).
Собственно идея: сделать мультиплеерный вариант флешки Age of War, где вместо компа - будет живой соперник.
Собственно теория реализации: каждый клиент обрабатывает и визуализирует игру по своему, обмениваются лишь действиями (клики о создании нового человечка, например)
Проблемы: рассинхронизация. Клиент1 с сервером имеют пинг 500мс, клиент2 с сервером такой же пинг, т.е. пока инфа от клиент1 придет клиент2 пройдет целая секунда, за это время боец клиента1 убьет бойца клиента2, а у клиента2 будет все наоборт, например. И тут пойдет рассинхрон. В конце окажется, что клиент1 думает, что победил он, а клиент2 думает, что он.
Сервер грузить рассчетами я не хочу (у стратегий же нет глобального сервера для этого, считает клиент-хост ситуацию).
Собственно как разрулить такую рассинхронизацию?
Передавать игровую ситауцию может быть слишком затратно для сети (пускай и раз в Н секунд, если произойдет рассинхрон, внезапное изменение ситуации будет очень заметно и не красиво для игрока)
В стратегиях вроде передают лишь действия игроков, а не саму игровую ситуацию, но как ее синхронизируют, что бы не расползлось все по швам?
LordXaosa
> каждый клиент обрабатывает и визуализирует игру по своему
Визуализирует - да.
Обрабатывает - нет.
> обмениваются лишь действиями
С сервером.
> В стратегиях вроде передают лишь действия игроков, а не саму игровую ситуацию, но как ее синхронизируют, что бы не расползлось все по швам?
Вся фишка в том, что игра живет на сервера. А на клиентах лишь визуализируется.
Каждое событие имеет время.
Если у одного пинг 500, а другого пинг 100. То второй будет ждать 1. На серверах задается тайм-аут. Если клиент превышает его, то он мёртвый.
Как-то так...
LordXaosa
Скопирую из соседней темы свой текст:
Все данные, которые игрок может ввести от мыши и клавиатуры превращаем в команды, которые заносим в буфер. далее эти команды вытаскиваются из буфера и выполняются (т.е. напрямую мышью не управляем - мышь кидает команды в буфер). Для каждого сетевого игрока заводим свой буфер. По сети передаем эти буфера друг другу. В результате получаем, что каждый компьютер знает, какие действия совершил игрок на всех других компьютерах. Выполняем действия для каждого игрока на каждом компьютере. Но тут, как таковой, сервер не нужен. И, главная сложность, нужно, чтобы компьютеры игроков делали всё один в один, что часто добиться не так-то просто, особенно для RTS. Короче говоря... эта синхронизация действий является сложнейшей задачей, потому что подобные ошибки вылавливать крайней сложно.
Ну, есть там еще некоторые тонкости, но суть вроде передал. Насколько я видел, все RTS того времени работали именно так, включая Starcraft. Если какой-то компьютер тормозил, то игра замерала - для RTS это всегда было нормально. Хотя... может сейчас что-то новое придумали... я, честно говоря, не слежу за этим.
У меня именно так работает вот эта игра:

Сама игра тут: http://astralax.ru/games (сеть работает только под XP, так как делалась игра давненько на DirectPlay5... Win7 почему-то не хочет коннектится к созданной игре)
В Order Of War логика была пошаговая (один ход, если память не изменяет, был 250мс или около того), между играющими пересылались команы и контрольная сумма по состоянию мира.
Как синхронизировали передачу команд не знаю, другим занимался, но вроде с этим ничего принципиально сложного быть не должно.
Tiendil
> В Order Of War логика была пошаговая
хм... мне как-то в голову не пришло, что с пошаговыми есть какие-то проблемы :-)
Odin_KG
>Если какой-то компьютер тормозил, то игра замерала - для RTS это всегда было нормально. Хотя... может сейчас что-то новое придумали... я, честно говоря, не слежу за этим.
В SC2 также как и в SC1...
Odin_KG
> Tiendil
> > В Order Of War логика была пошаговая
> хм... мне как-то в голову не пришло, что с пошаговыми есть какие-то проблемы
Это RTS, но логика расчитывается по тикам (т.е. на уровне реализации логики игра пошаговая, а игрок видит RTS за счёт короткого хода в четверть секунды и сглаживания в графике).
Тоже оставлю тута боянчик .
В двух словах:
1) даже реалтайм стратегии - "пошаговые".
2) симуляция на каждом клиенте/сервере должна быть идентична, независимо от машины
3) твой клиент не выполняет даже твою команду, пока не убедится, что все остальные получили ее. То есть выполнение команды будет явно не в том же "шаге".
Как-то так
Tiendil
> Это RTS, но логика расчитывается по тикам
ну, тогда выше я всё правильно написал
Belfegnar
> 2) симуляция на каждом клиенте/сервере должна быть идентична, независимо от
> машины
По-моему, тут никакой сервер вообще не нужен - его задача просто создать игру и установить контакт между игроками. Далее через него можно вообще ничего не гонять.
> 3) твой клиент не выполняет даже твою команду, пока не убедится, что все
> остальные получили ее. То есть выполнение команды будет явно не в том же
> "шаге".
Это так. Сначала собирается информация от всех игроков, а потом происходит выполнение. Точнее информация собирается заранее, а выполнение происходит позже. В момент выполнения собирается следующая порция информации - происходит небольшое отставание.
Вообще если общий Update идет примерно 25 раз в секунду, то собирать информацию по сети можно вполне и 5 раз в секунду. Эта штука называется Латентность, что практически означает быстроту реакции на действия человека.
Komei
> В SC2 также как и в SC1...
Я так и предполагал, что всё осталось по-старому.
Стратегии отличаются от других мультиплеер игр, таких как FPS, Slasher, RPG и т.п.
Отличается тем что в стратегии огромное количество мобов и слишком большой объём данных, чтобы это дело гонять туда-сюда между сервером и клиентами, также просчитывать на сервере. Ты же не собираешься браготворительностью заниматься, создавая кластерную ферму сервером за бешенные деньги, чтобы кто-то в стратежку с друзьями поиграть мог. Утрирую конечно, но при реалтайм несколько тысяч пользователей, такой вопрос встанет.
Даже современные RTS обычно p2p либо гибрид.
Большинство симуляции и принятия решений происходит на клиентах, а именно они друг друга "перевыполняют", и синхронизируются далее. Если кто-то слишком расходиться в показаниях от других, то видимо либо лаги конкретные либо читер.
Это распределённая модель нагрузки и принятия решений. Главной задачей в такой модели это реализовать систему стабильной синхронизации и выявление десинхронизации.ю с последующими "санкциями".
Плюсы в такой системе очевидны - центральные сервера занимаются только lobby и сбором игроков в игровые сессии, а сама игра считается уже у каждого клиента, так что серверная часть тут малая.
Минусы - тяжесть клиента, он становиться более ответственный и усложняется. По сути мы просто переносим то что было бы на сервере на клиентов, с дополнительными плюшками.
Кстати подобную систему, можно использовать для отдельной части логики и в других жанрах. Например в FPS, можно смело считать логику на клиентах имея по 3+ ответственных за просчёт клиентов. Фишка в том что каждому клиенту нужно будет считать только объекты которые по близости и с которыми клиент взаимодействует, и синхронизироваться с другими клиентами рядом этими данными. Сервер же не будет иметь никакого дела до просчёта самой физики, а лишь будет знать где объекты находятся от клиентов, и выявлять тех кто сильно отличается, и "наказывать" (логикой) либо просто "грубо" синхронизировать с другими данными.
Тема в архиве.