67 / 30 / 17
Регистрация: 07.10.2018
Сообщений: 378
1

Вычисление на сервере, а не на клиенте

16.09.2022, 01:48. Показов 676. Ответов 7
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Дело такое: делается онлайн игрушка на сокет ио, есть всякие шарики и тд, всю суть нет смысла рассказывать. Когда один игрок бьет шарик, то он начинает перемещаться, такое же перемещение должно произойти и у другого пользователя. Все происходит супер, я передаю начальные данные и шарики начинают двигаться, но есть проблема: так как все вычисления происходят в самом браузере, то анимация у двух пользователей может отличаться из-за разного количества фпс и производительности пк

Можно как-то вычисления по обновлению позиции шаров (их анимация) производить не в браузере, а например на вебсервере?
Или возможно есть другой вариант решения?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.09.2022, 01:48
Ответы с готовыми решениями:

@now на сервере и клиенте
Привет, Получаем на клиенте серверное время, используя функцию @Now(; имя_сервера), затем вызываем...

Папки на сервере и клиенте
Использую ClientSocket1 и ServerSocket1 как просмотреть папки на клиенте в виде дерева, ну как в...

Переменная на клиенте и на сервере
Доброго дня. Хочу прояснить такое дело. Объявлена переменная Тест. Если я инициализирую ее в...

Авторизация на сервере или клиенте?
Добрый вечер уважаемые разработчики! Вопрос теоретический. Сейчас тестируют авторизацию с...

7
5158 / 2770 / 465
Регистрация: 05.10.2013
Сообщений: 7,321
Записей в блоге: 147
16.09.2022, 12:09 2
Цитата Сообщение от deekep Посмотреть сообщение
то анимация у двух пользователей может отличаться из-за разного количества фпс и производительности пк
Это решается с помощью delta time. В этой статье подробно описано и delta time и всё что вам нужно по этой теме: http://buildnewgames.com/real-time-multiplayer/

Я развернул пример статьи на бесплатном хостинге Heroku (запустите в разных вкладках браузера): http://battle-world.herokuapp.com/?debug

В конце статьи есть ссылка на исходники: https://github.com/ruby0x1/rea... r-in-html5

Прикреплю на всякий случай:
Вложения
Тип файла: zip realtime-multiplayer-in-html5-main.zip (34.6 Кб, 2 просмотров)
2
5158 / 2770 / 465
Регистрация: 05.10.2013
Сообщений: 7,321
Записей в блоге: 147
16.09.2022, 12:35 3
Цитата Сообщение от 8Observer8 Посмотреть сообщение
запустите в разных вкладках браузера
Лучше в двух окнах браузера расположенных рядом с друг другом. Лобби там такое, что автоматически создаётся новая игра для двух игроков. Перемещение на WASD и клавиши-стрелки.
1
67 / 30 / 17
Регистрация: 07.10.2018
Сообщений: 378
16.09.2022, 15:22  [ТС] 4
8Observer8, да, в управлении я разобрался. Анимация действительно одинаковая, выглядит как то, что надо. Осталось разобраться в коде)

Добавлено через 2 часа 39 минут
8Observer8, я правильно понял, что если сказать простым языком, то при изменении отправляется сообщение на сервер с каждый кадром сдвига игрока?
0
5158 / 2770 / 465
Регистрация: 05.10.2013
Сообщений: 7,321
Записей в блоге: 147
16.09.2022, 16:11 5
При нажатии клавиш происходит сохранение значений нажатых клавиш в массив и это массив отправляется на сервер. Отправляется только массив клавиш и ничего больше. На клиенте и сервере по два игровых цикла. Один цикл на сервере и клиенте работает с одним и тем же периодом - 0.015 msec (66.666.. кадров в секунду). Это цикл для игровой физики, например, для коллизий. Второй цикл на клиенте - это requestAnimationFrame(), а второй цикл на сервере - это низкочастотный цикл с периодом 0.045 msec (20 кадров в секунду) для приёма и отправок посылок клиентам. То что клиент начинает сразу реагировать на нажатия клавиш - это называется предсказания клиента, а корректируются предсказания после получения ответа от сервера. Клиенты ещё интерполируют (сглаживают) перемещения других клиентов, чтобы перемещения были неотрывистыми, а плавными. Общую идею я вроде хорошо понял, но код до конца не разобрал, где-то процентов 80 разобрал. С коллизиями разберусь в @box2d/core и в @dimforge/rapier3d-compat, а потом буду внедрять коллизии в клиента и сервера. Пока надо побольше поработать с коллизиями без сервера - написать марио и танчики. У меня есть наработки. Недавно делал на C++ и Box2D демку на скрине ниже, теперь перевожу на TypeScript и WebGL. В планах давняя мечта сделать клон Марио, где можно будет одновременно проходить вдвоём в браузере.

1
67 / 30 / 17
Регистрация: 07.10.2018
Сообщений: 378
16.09.2022, 16:15  [ТС] 6
8Observer8, дело в том, что у меня движение происходит не по нажатию клавиш. Пользователь бьет шар, а дальше он летит, может ударяться с другими шарами, отталкиваться от стенок и все такое. Все, что я нашел в интернете (не считая вашего варианта), так это отправка положения с помощью интервала раз в какое-то количество секунд на сервер, а с сервера уже второму клиенту

Но меня смущает одно: при таком методе происходит огромное количество запросов туда сюда, не приведет ли это к нежелательным последствиям?
0
5158 / 2770 / 465
Регистрация: 05.10.2013
Сообщений: 7,321
Записей в блоге: 147
16.09.2022, 16:47 7
Цитата Сообщение от deekep Посмотреть сообщение
при таком методе происходит огромное количество запросов туда сюда, не приведет ли это к нежелательным последствиям?
В вашем случае движение шара будет происходить в одинаковых физических циклах с периодом 0.015 msec (~66 раз в секунду) на клиенте и сервере - эти два одинаковых игровых цикла работают параллельно на клиенте и сервере. Посылки будут идти только от авторитарного сервера и только в низкочастотном цикле сервера с периодом 0.045 msec (~22 раза в секунду). Эти посылки от сервера будут использоваться для корректировки предсказания клиента (клиентский физический цикл) и для интерполяции других клиентов, чтобы другие игроки двигались плавно у конкретного клиента.

Добавлено через 14 минут
Цитата Сообщение от 8Observer8 Посмотреть сообщение
В вашем случае
В примере статьи так и реализовано, что авторитарный сервер отсылает состояния игровых объектов в низкочастотном цикле. В статьи сказано, что таких циклов может быть несколько, например, какой-то цикл можно сделать раз в 5 минут - пересылать температуру воздуха.

Цитата Сообщение от 8Observer8 Посмотреть сообщение
в одинаковых физических циклах
Не должно пугать слово "физики". Это не значит, что обязательно должен присутствовать физический движок и какая-то физика. То что у вас реализовано движение шара по прямой - это и есть физика, просто у вас равномерное прямолинейное движение, значит, вы написали свой физический движок. Тоже самое можно было сделать на физическом движке Box2D с помощью библиотек-портов Box2D - box2d/core или planck.js, либо matter.js, либо rapier2d-compat и других 2D физических движков, либо 3D физических движков, которых тоже штук 5 актуальных есть.
2
67 / 30 / 17
Регистрация: 07.10.2018
Сообщений: 378
16.09.2022, 21:08  [ТС] 8
8Observer8, спасибо Вам за такие развернутые ответы, буду пытаться разобраться
1
16.09.2022, 21:08
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.09.2022, 21:08
Помогаю со студенческими работами здесь

Запуск скрипта и на текушем клиенте и на сервере
Чудо какое-то. LN 7.0.3, а сервер 8 версии. Написал некотороый агент и поставил его исполнятся по...

Создаю объект на сервере, и он не отображается на клиенте
Создаю объект на сервере, и он не отображается на клиенте. То есть, создаю объект: Transform...

Синхронизация баз данных на клиенте и сервере
Здравствуйте, подскажите как реализовать простенькое клиент-серверное приложение в котором при...

Проверка и работа с лицензией на сервере и клиенте
Задача в следующем: получить уникальный идентификатор машины, на котором будет запускаться...

Где выполняется функция на сервере или клиенте?
как определить где выполняется функция на сервере или клиенте?

Как можно синхронизировать 2 массива на клиенте и сервере ?
Необходимо синхронизировать и взаимно изменять массивы "field" в проекте, соединение через сокеты....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru