Сергей: Понятно, а можете поделиться ссылками про tcp udp в играх что бы лучше понять разницу.
За счет чего в квейк лаги с 20 игроков? из за скорости обновления?
Сергей: Понятно а про локацию что скажете, разлиновать всю карту по квадратикам, сделать из нее массив. в этот массив поместить игроков. игрокам назначить "радиус видимости" и в радиусе видимости доставлять пакеты?
Потому что допустим на всей карте 1000 игроков и отправлять большуший серриализованный и зашифрованный пакет [player1,player1000] будет тяжело для самого пакета и тежяло расшифровывать и делать обход на клиенте.
Сергей: "мы на сервере моделируем весь игровой процесс. за единицу времени расчитали все изменения, собрали это в пакет и разослали этот "diff" всем 100 игрокам. и получили ответ с действиями каждого игрока. т.е. получается 100 сообщений таду и 100 обратно. далее все повторяется.
далее. если в игре есть физика, то траекторию того же самого фаербола, можно расчитать и на клиенте(зная скорость, радиус поражения и т.д.), а вот попал он в итоге или нет уже зависит успел ли противник убежать или нет. но передавать координаты самого фаербола, вроде как и ненужно, клиент сам это отрисует, важно лишь событие попадания фаербола во врага."
Сергей: Допустим игроки дерутся и формируется пакет [player1,player2,] в нутри которых будут вшиты: действия, параметры, координаты, все это серриализовано и зашифровано. Мини кри получатеся.
Синхронизация конечно самое основное: игрок1 ударил игрока2, нужно как то зашифровать этот удар, отправить на сервер и оповестить игрока 2 о нанесенном уроне.
Все параметры тогда должны хранится на сервере а на клиенте только графика и отправка пакетов.
Сергей: Очень интересная мысль спасибо! А если взять например бег. Тут может быть два варианта как нажатие мышкой и бег в одном направлении
и зажатая клавиша как в квейк. посылается пакет с направленим вектора, скоростью и клиент его рисует. Установился таймер в виде тика, сервер ждет от клиента следующий пакет с тем же действием ну или с путсым действием.
И между этими действиями происходит выстрел, вешается таймер "отката" и после этого мы ждем следующий такой же пакет.
дело в том что - что бы все это происходило плавно, нужно буквально флудить этими пакетами. а если отправлять их медленно тогда будут рывки, а запоздавшием сообщения будут отбрасывать персонажа назад
Сергей: Да серьезно хочу и начать именно с тестирования сообщений и синхронизации, потому что когда на него будет накручена игровая механика будет еще тяжелее.
Нет, хочу сделать один раз что то серьезное - локации это не очень хорошо, единый мир лучше всего.
Суть в том что: если слать часто очень подробные пакеты - будет идеально, но будут лаги с возрастанием количества пользователей.
если слать пакеты редко, то клиента придется заставлять угадывать что будет делать игрок прежде чем придет следующий пакет и тут уже будет сложнее синхронизировать.
Игрок пробежал 400 метров, а следующий пакет отбрасывает его назад и разворачивает на 30 градусов.
С локациями: хорошо если она одна большая и переходы между локациями выполнены в виде "дверей" и "пещер", так что бы в момент перехода игроки друг друга не видели.
А если переходов нет - тогда игроки несмогу друг друга видеть в разных локациях чисто на уровне кода приложения, на клиенте соответственно тоже.
Например персонаж бежит по дороги и происходит смена локации (визуально находясь в том же месте)
Сергей: а это уже смотря как выглядит сеть и "пакет" если так {user-data1,user-data2,user-data3}, а если от каждого по отдельности. И опять же как их синхронизировать? Бесперебойный флуд? Или накапливать и всем одновременно рассылать или может быть ставить в очередь?
Сергей: Но тогда какая нагрузка ложится на клиент: есть 199 персонажей или объектов, нам за один "пакет" приходит допустим действия о всех них и мы на клиенте их пытаемся изобразить пока не придет следующий пакет?
Спасибо проясняется!
Да сначала нужно написать чат, дали интересну ссылку по теме www.gabrielgambetta.com/fpm_live.html Всеравно какой то алгоритм синхронизации должен быть. Я нажал бежать в точку x клиент ее пробежал, но в какой то момент передумал и развернулся. В это время у другого игрока на клиенте он все еще бежит в ту же сторону.
Тоесть мы будем в следующий раз уже перепроверять бежит ли он в ту же сторону.