«Кофемен» это бомбер, только вместо бомб чашки кофе. Чашка качается, кренится и опрокидывается, а кофе растекается крестом с пенкой. Чем дальше брызги, тем больше чашка: эспрессо, американо, латте, раф. А детонатор называется «Колд брю».
И тут я встретил главного босса сетевых игр: лаги. Играешь, а персонажа дёргает назад, мир на экране замирает, бот тебя ловит, хотя ты давно ушёл.
Чинил в пять заходов:
1. Сервер главный, клиент угадывает свой ход. Откаты на поворотах при пинге от 150 мс.
2. Нажатия с номерами тиков, как в Quake. Снова откаты. Оказалось, часы сервера шли 19,875 тика в секунду вместо 20, и очередь переполнялась.
3. Сервер прогоняет все пришедшие команды за тик, как в Quake 3. Клиент всё равно догонял сервер.
4. Своё положение решает сам клиент, сервер только проверяет. Персонаж перестал откатываться.
5. Но боты, чашки и брызги всё равно приходили с сервера и замирали.
Тогда я перестал гадать и замерил. Внутри сервера кадры шли ровно. А через интернет до сервера в Европе несколько раз в минуту были паузы от 0,2 до 0,7 секунды. Дело было не в коде, а в самой сети.
Тут пришла идея: пусть каждый считает мир сам, а по сети ходят только действия людей. Я обрадовался, а потом выяснил, что придумал это не я. Так устроены Age of Empires, StarCraft и файтинги, называется детерминированная симуляция. Ну хоть изобрёл правильное.
Как это работает у меня:
• один и тот же код правил крутится в каждом браузере и на сервере;
• по сети идут только «повернул», «поставил чашку», «опрокинул» с номером тика, около 2,6 КБ/с на игрока;
• опоздавшее действие встаёт на свой тик, и мир пересчитывается с этого места;
• раз в секунду миры сверяются, и если разошлись, браузер сам просит свежую копию.
В тесте один из игроков сидел на «мобильной» линии с залипаниями до 0,9 секунды. Ноль откатов, а в конце миры совпали с сервером до бита. На живом мобильном интернете руками ещё не проверял, это следующий шаг.
Игры делаю для клиента, поэтому ссылки на прототипы дам позже, когда он разрешит их показать. Когда выложу, заходите и выбирайте компанию FedrBodr: там идёт битва компаний.
Нужна такая игра для события, бренда или команды? Сделаю недорого, от 10 000 ₽ за день работы. А могу научить делать такие самому. Пишите в личку.